0

我正在使用 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

但这会阻止访问任何成绩簿。我还尝试了无数其他排列无济于事。

4

2 回答 2

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
于 2013-04-26T03:29:35.960 回答
0

我想到了。这与成绩簿是嵌套资源这一事实有关。在成绩簿控制器中,我最初只是调用了 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-29T18:19:29.277 回答