什么是授权,并检查使用CanCanCan一个命名空间,模型少控制器能力的正确方法是什么?
很多google搜索和阅读维基之后,我现在有
#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."
在一个示例中,维基建议创建一个命名空间控制器的独立能力类。 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
你的控制器确实有一个模型。也许这也从ApplicationController继承而来? (这将是做一个顺理成章的事情。)
如果你正试图避免影响某些控制方法,使用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/CanCanCommunity/cancancan/wiki/Ability-for-Other-Users