使用Cancancan授权和检查功能的正确方法是什么?
在谷歌搜索和阅读Wiki之后,我目前有
#controllers/namespaces/unattacheds_controller.rb
def Namespaces::UnattachedsController
authorize_resource class: false
def create
# does some stuff
end
end
#models/ability.rb
def admin
can [:create], :namespaces_unattacheds
end
#view/
<%= if can? :create, :namespaces_unattacheds %>
# show a create form to authorized users
<% end %>
这是无法正确授权控制器的。管理员可以看到条件创建表格,但无权发布到创建动作。
post :create, valid_params
Failure/Error: { it { expect( flash ).to have_content "Successfully created" }
expected to find text "Successfully created"
got: "You are not authorized to access this page."
在一个示例中,Wiki建议为命名置控制器创建一个单独的能力类。https://github.com/cancancommunity/cancancan/wiki/admin-namespace
是否有更简单的方法可以实现这一目标?该应用程序使用许多名称置控制器,我真的不想为每个命名控制器创建一个能力类。
是否有正确的语法来参考能力类中的命名置控制器?
can [:create], Namespaces::Unattacheds
can [:create], :namespaces_unattacheds
can [:create], namespaces/unattacheds
????
听起来您在Namespaces::Unattacheds
模型上设置权限,这意味着您的控制器不需要执行:
authorize_resource class: false
您的控制器确实有一个模型。也许它也从Application Controller继承了?(那是合乎逻辑的事情。)
如果您试图避免影响某些控制器方法,请使用only
/except
条款,如下所述:https://github.com/cancancommunity/cancancan/wiki/authorizing-controller-actions#choosing-actions
我认为,如果命名空间的深度与您的模型和控制器之间的匹配,则不会是问题。您只需要load_and_authorize_resource
和ability.rb
中的正确表格:
can [:create], Namespaces::Unattacheds
也许不是最漂亮的解决方案,但我设法通过添加
来实现这一目标skip_authorization_check
before_action { raise CanCan::AccessDenied unless current_user.can?(params[:action].to_sym, ::namespaces_unattacheds) }
如果您这样做,则可以将您想要的任何内容从此控制器传递给能力类。
您需要添加罐子?方法首先可以使用此https://github.com/cancommunity/cancancan/wiki/ability-for-other-users
添加答案,因为这个问题似乎正在获得合理数量的访问者。希望它可以帮助某人。
我在这里收到了一些很好的建议,可以帮助我思考自己的问题。最终,我意识到我正在用我试图实现的目标与坎坎坎的惯例作斗争。
我互换了Pundit,这使我能够在参考特定策略类时授权控制器中的对象。像
# Admin::UserController
def update
authorize @user, policy_class: Admin::UserPolicy
end
# UserController
def update
authorize @user, policy_class: UserPolicy
end
与控制器上定义的强参数结合在一起,我能够确保只能更新特定的属性。
这对每个人都不起作用。例如,如果该方法绕过控制器(例如,通过控制台),则该方法不会阻止Admins更新所有用户的属性。但它适合我的情况。