簡體   English   中英

Cancancan嵌套資源授權

[英]Cancancan nested resource authorization

我的工作能力定義如下:

的routes.rb

resources :projects do
  resources :tasks
end

ability.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

如果邀請他們加入項目,這可以讓用戶正確創建任務。

但是,我不希望用戶能夠:管理項目。 我只需要用戶能夠為項目編制索引,如下所示。

ability.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能力?

您可能應該定義用戶在被邀請時可以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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM