使用CanCanCan授权和检查命名空间无模型控制器的能力的正确方法是什么?
经过大量的谷歌搜索和阅读维基,我目前有
#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建议为命名空间控制器创建单独的Ability类。 https://github.com/CanCanCommunity/cancancan/wiki/Admin-Namespace
有没有更简单的方法来实现这一目标?这个应用程序使用了许多命名空间控制器,我真的不想为每个控制器创建一个能力类。
是否有正确的语法来引用Ability类中的命名空间控制器?
can [:create], Namespaces::Unattacheds
can [:create], :namespaces_unattacheds
can [:create], namespaces/unattacheds
????
答案 0 :(得分:0)
听起来您正在设置Namespaces::Unattacheds
模型的权限,这意味着您的控制器不需要这样做:
authorize_resource class: false
您的控制器确实有型号。也许它还继承自ApplicationController? (这是合乎逻辑的事情。)
如果您尝试避免影响某些控制器方法,请使用only
/ except
子句,如下所述:
https://github.com/CanCanCommunity/cancancan/wiki/Authorizing-controller-actions#choosing-actions
如果模型与控制器之间匹配,我认为名称空间深度不是问题。您只需要load_and_authorize_resource
中的ability.rb
以及can [:create], Namespaces::Unattacheds
中的正确表单:
{{1}}
答案 1 :(得分:0)
也许不是最漂亮的解决方案,但我设法通过添加
实现了这一点skip_authorization_check
before_action { raise CanCan::AccessDenied unless current_user.can?(params[:action].to_sym, ::namespaces_unattacheds) }
如果您这样做,则可以将所需的任何内容从该控制器传递给能力类。
您需要添加罐头吗?方法首先可以使用此https://github.com/CanCanCommunity/cancancan/wiki/Ability-for-Other-Users