CanCan仅在current_user与项目关联时才允许操作

时间:2014-05-15 15:09:35

标签: ruby-on-rails ruby-on-rails-4 cancan

我正在使用cancan进行授权,我希望根据多对多关系进行一些限制。

实体

 User - has_many project_assignments
 User - has_many projects, through: :project_assignments

 User - has_many roles, through: :project_assignments

ProjectAssignment:user_id,project_id,role_id

我想让用户能够在CRUD模型上执行完整的Project and Toy,只有当项目是由用户创建时才是这样。玩具嵌套在Project

Toy has many ProjectsProject has many ToyProjectToy

 if user.role? :moderator
   can :crud, [Project, Toy]
 end

我想我只需要限制project,因为toy取决于project_id,我可以这样做吗?

2 个答案:

答案 0 :(得分:2)

我会尝试使用某种if语句来表示第二对多:

can :crud, Project do |project|
  ProjectAssignment.where(user_id: user.id, project_id: project.id).any?
end

can :crud, ProjectToy do |project_toy|
  ProjectAssignment.where(user_id: user.id, project_id: project_toy.project.id).any?
  if can? :crud, ProjectToy
    can :crud, Toy do |toy|
      ProjectToy.where(toy_id: toy.id).any?
    end
  end
end

PS - 您可能需要小心:crud并将其替换为[:edit,:update,:destroy,:delete]然后给出一个单独的can来:create,因为如果用户正在创建一个项目/玩具第一次系统将找不到与他/她相关的任何玩具或项目,并且不提供访问权。

答案 1 :(得分:1)

我找到了解决方案:

在我的Project控制器中,我添加了:

load_and_authorize_resource through: :current_user

在我的玩具控制器中,我添加了:

load_and_authorize_resource project, through: :current_user load_and_authorize_resource :toy, through: :project

在我的能力档案中:

if user.role? :moderator
   can :crud, :all or [Project, Toy]
end

一切正常,我已经为多个项目分配了一个用户,并且可以访问每个项目。