【问题标题】:Check if current request is protected in Rails with CanCan使用 CanCan 检查当前请求是否在 Rails 中受到保护
【发布时间】:2017-01-25 14:02:57
【问题描述】:

我在我的 Rails 应用程序中使用 CanCan gem,并想检查当前请求是否是我的应用程序中的受保护资源。

例如,我有以下内容:

class AdminController < ApplicationController

  load_and_authorize_resource

end

如何检查请求是否受 CanCan 保护?

我可以通过参数访问控制器和操作。我不能使用标准的 can?cannot? 助手,因为它们会检查 current_user 是否有权限,而不是操作本身是否有保护。

例如:

class ApplicationController < ActionController::Base

  before_action :check_protected

  def check_protected
    if can? params[:action].to_sym, Object.const_get(params[:controller].classify)
      # resource is protected
    else
      # resource is not protected
    end
  end

end

^^ 这不起作用,因为当没有current_user 或用户没有权限时,它总是会说false我需要检查资源本身是否受 CanCan 保护。

如果我有这些例子:

class PostsController < AdminController

  def index
  end

end

class HomeController < ApplicationController

  def index
  end

end

PostsController 的索引应该可以识别为受保护,而 HomeController 的索引应该是不受保护的。

【问题讨论】:

  • CanCan 是一个用户授权 gem,目的是检查用户是否可以访问授权资源。它需要一个能力类和 current_user 方法才能工作。您可以按照on this page 的说明覆盖默认值。
  • @trueinViso 我确实有Ability 类和current_user 方法。但我想知道当前控制器方法是否附加了任何 cancan 属性。
  • 控制器方法没有附加任何 cancan 属性。这些能力是在 current_user 上定义的。当你说 skip_authorize_resource 只是意味着它不会检查 current_user 是否有权访问资源。

标签: ruby-on-rails ruby cancan cancancan


【解决方案1】:

CanCan 使用CanCan::ControllerResource#skip? 方法来确定它是否应该授权资源。所以我猜你可能会这样依赖它:

  def check_protected
    if CanCan::ControllerResource.new(self).skip?(:authorize)
      # resource is not protected
    else
      # resource is protected
    end
  end

我已经在我的沙盒中尝试过,它对我有用

【讨论】:

  • 得到错误uninitialized constant CanCan::ControllerResouce 所以它总是认为资源受到保护。
  • 语法可能会根据您使用的 CanCan 版本而谨慎
  • 它不再抱怨错误,但它仍然返回 false 对所有内容,甚至是对它们有保护的资源。例如self 返回#&lt;Admin::DashboardController:0x007fa7da209228&gt;,Dashboard 继承自我的AdminController,其中包含load_and_authorize_resource
  • 好吧,skip? 方法应该为受保护的资源返回 false
  • 没错。但是对于不继承自 AdminController 并且其中没有 load_and_authorize_resource 或任何父控制器的控制器,它会返回 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2021-11-02
  • 2023-03-26
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多