我正在使用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 Projects
和Project has many Toy
到ProjectToy
if user.role? :moderator
can :crud, [Project, Toy]
end
我想我只需要限制project
,因为toy
取决于project_id,我可以这样做吗?
答案 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
一切正常,我已经为多个项目分配了一个用户,并且可以访问每个项目。