当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
但是什么呢?
答案 0 :(得分:0)
不喜欢“链接答案”,但是确实如此。
# 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
您必须输入更多,但另一方面,没有魔术的后备。