如何使用CanCanCan授权命名,型号少控制器?

问题描述 投票:1回答:2

什么是授权,并检查使用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
????
ruby-on-rails cancan cancancan
2个回答
0
投票

这听起来像你在Namespaces::Unattacheds模型,这意味着你的控制器不需要做权限设置:

authorize_resource class: false

你的控制器确实有一个模型。也许这也从ApplicationController继承而来? (这将是做一个顺理成章的事情。)

如果你正试图避免影响某些控制方法,使用only / except条款,如下所述:https://github.com/CanCanCommunity/cancancan/wiki/Authorizing-controller-actions#choosing-actions

我不认为该命名空间的深度是一个问题,如果它您的模型和控制器之间的匹配。你只需要load_and_authorize_resourceability.rb适当的形式:

can [:create], Namespaces::Unattacheds

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

© www.soinside.com 2019 - 2024. All rights reserved.