当仅传递类对象(无实例)时,如何防止CanCan授权访问?

时间:2019-08-01 13:10:31

标签: ruby-on-rails cancan

当CanCan的load_and_authorize_resource找不到对象的实例时,它会后退以针对该对象的类本身进行授权。

CanCan wiki复制:

  

添加authorize_resource将安装一个调用authorize!的before_action回调,并传递资源实例变量(如果存在)。如果未设置实例变量(例如在index动作中),它将传入类名。例如,如果我们有一个ProductsController,它将在每次操作之前执行此操作。

authorize!(params[:action].to_sym, @product || Product)

默认情况下,CanCan似乎将行为授予对象类。首先,我发现这种行为令人恐惧。但是抛开这一点,我无法弄清楚阻止访问该类的语法是什么。

在上述@product为零的情况下,您将什么内容放入功能文件中以防止cancan允许访问?

设置类权限(而不是对该类的操作)的语法是什么?

如果设置普通权限的语法是:

can [:edit], Page do |page|
  page.author == user
end

然后在类本身上设置权限的语法是什么

# This doesn't work
can [:edit], Page do |page|
  false if !page
  page.author == user
end

但是什么呢?

2 个答案:

答案 0 :(得分:0)

不喜欢“链接答案”,但是确实如此。

来自CanCan wiki

# don't do this
can :update, Project do |project|
  user.admin? # this won't be called for Project.accessible_by(current_ability, :update)
end

# do this
can :update, Project if user.admin?

答案 1 :(得分:0)

解决方案很简单:请勿使用load_and_authorize_resource并自行致电authorize!。像这样:

def index
  authorize!(:index, Product)
  ...
end

def show
  @product = Product.find(params[:id])
  authorize!(:show, @product)
  ...
end

您必须输入更多,但另一方面,没有魔术的后备。