【问题标题】:Cancancan nested resource authorizationcancancan嵌套资源授权
【发布时间】:2017-05-28 18:53:52
【问题描述】:

我的工作能力定义如下:

routes.rb

resources :projects do
  resources :tasks
end

能力.rb

can [:manage], Project, invites: {supplier: {:user_id => user.id}}
can [:new, :create], Task
can [:update, :show, :destroy, :edit], Task, user_id: user.id

任务控制器:

load_and_authorize_resource :project
load_and_authorize_resource :task, :through => :project

如果用户被邀请到项目中,这可以正确地让用户创建任务。

但是,我不希望用户能够:管理项目。我只需要用户能够如下索引项目。

能力.rb

can [:index], Project, invites: {supplier: {:user_id => user.id}} ## breaks when changing :manage to :index here
can [:new, :create], Task
can [:update, :show, :destroy, :edit, :index], Task, user_id: user.id

当我加入上述能力后,用户将无法再访问或对任务执行任何操作。如何通过项目创建任务能力,只给项目一个:index能力?

【问题讨论】:

  • can [:index], Project, invites: {supplier: { user_id: user.id }} - 但您确实处于复杂的地步,Pundit 是比 CanCanCan 更好的选择。
  • 是的。这是我需要进行身份验证的最后一块。看看我是否可以避免重建。

标签: ruby-on-rails cancan cancancan


【解决方案1】:

您可能应该定义用户在受邀时可以read 一个项目。因此:

如果被邀请,用户可以阅读项目(我猜invites: { supplier: { user: user} } 定义了受邀用户)

can :read, Project, invites: { supplier: { user: user} }

那么你必须说用户可以为他被邀请的项目创建任务,那么:

can [:new, :create], Task, project: { invites: { supplier: { user: user} } }

最后,您定义用户可以在他邀请的项目上管理自己的任务:

can :manage, Task, user: user, project: { invites: { supplier: { user: user} } }

你也可以通过提取来简化条件

invited_to = { invites: { supplier: { user: user} } }
can :read, Project, invited_to
can [:new, :create], Task, project: invited_to
can :manage, Task, user: user, project: invited_to

【讨论】:

  • 差不多了,我需要能够为这个角色在项目上定义自定义操作(一个单一方法),所以,我必须避免Project 上的:read:manage 为那些分配了太多的权利。我可以一起取出项目身份验证,但是,只要我这样做can :manage, Task, user: user,它就允许用户在他们没有被 URL hacking 邀请的任何项目下创建一个任务..
  • :read 在您的项目中应该没问题,因为它提供了:index:show。关于第二点,我更新了答案。
  • 是的,我最终只为该项目授予了show 权限,并按角色限制了页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多