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



使用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_resourceability.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更新所有用户的属性。但它适合我的情况。

最新更新