如何使用CanCanCan授权名称空间,无模型控制器?

时间:2016-12-11 07:59:15

标签: ruby-on-rails cancan cancancan

使用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
????

2 个答案:

答案 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

相关问题