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



当cancan的load_and_authorize_resource找不到对象的实例时,它落后于授权对象的类本身。

从Cancan Wiki复制:

添加授权_Resource将安装一个forter_action回调,该回调呼叫授权!,如果存在资源实例变量。如果未设置实例变量(例如在索引操作中(,则将通过类名。例如,如果我们有一个productscontroller,它将在每个动作之前执行此操作。

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

和默认情况下,Cancan似乎将行为授予对象类。首先,我发现这种行为令人恐惧。但是除了那样,我无法弄清楚语法是为了防止访问该类的语法。

在上面的情况下, @product nil的位置,您在能力文件中放置了什么以防止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

但是什么?

不喜欢"链接答案",但事实。

来自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?

解决方案很简单:不要使用 load_and_authorize_resource并亲自调用 authorize!。这样的东西:

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

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

相关内容

最新更新