我正在使用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
但这阻止了对任何成绩册的访问。我还尝试了无数的其他排列,但都无济于事。
发布于 2013-04-29 18:19:29
我想通了。这与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 }
现在,它的行为符合预期。
发布于 2013-04-26 03:29:36
我的应用程序中有这样的代码,它工作得很好。你可以试一下:
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
https://stackoverflow.com/questions/16228144
复制