我正在使用CanCan进行授权。下面的代码按照我打算用户的方式工作,即它允许非管理员用户查看他们自己的页面而不是其他用户的页面。但是,定义成绩簿能力的行允许访问用户的成绩簿(这是与属于用户的成绩簿的一对一关系)以及能够查看其他用户的成绩簿。
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.has_role? :admin
can :manage, :all
else
can :read, User, :id => user.id
can :read, Gradebook, :user_id => user.id
end
end
end
CanCan文档包含以下示例:
can :read, Project, :active => true, :user_id => user.id
这似乎为我正在尝试做的事情提供了一个模型,但我无法让CanCan阻止访问其他用户的成绩簿,同时允许访问用户自己。 我也尝试了以下内容:
cannot :read, Gradebook do |book|
book.user_id != user.id
end
但是这会阻止访问任何成绩簿。我也试过无数其他的排列无济于事。
答案 0 :(得分:0)
我的应用中有这样的代码,效果很好。你可以尝试一下:
def initialize(user)
user ||= User.new
if user.has_role? :admin
can :manage, :all
else
can :read, user
can :read, Gradebook, user: user
end
end
答案 1 :(得分:0)
我明白了。它与Gradebook是嵌套资源这一事实有关。在成绩簿控制器中,我最初刚刚调用了load_and_authorize_resource,但我将其更改为:
load_and_authorize_resource :user
load_and_authorize_resource :gradebook, :through => :user, :singleton => true
然后在我的能力档案中我使用了这个:
can :read, Gradebook, :user => { :id => user.id }
现在它的行为符合要求。