簡體   English   中英

使用 CanCanCan,我如何在 controller 中授權 either/or?

[英]Using CanCanCan, how do I authorize either/or in a controller?

我有一個用於管理多個對象(如用戶和組)的頁面,我想確保只有有權創建至少其中一種對象的用戶才能查看該頁面。

基本上,我希望能夠寫出類似的東西

(authorize! :create, User) || (authorize! :create, Group)

有什么建議么?

實現這一目標的一種方法是混合

load_and_authorize_resource :user
load_and_authorize_resource :through => :user

這是一個方便的助手,用於調用控制器中所有資源的授權,執行類似這樣的操作:

class GroupsController < ActionController::Base
  load_and_authorize_resource
  load_and_authorize_resource :through => :user

  def create
    # Automatically does the following:
    # @group = Group.find(group_params[:id])
    # authorize! :create, @group

    # @user= User.find(group_params[:user_id])
    # authorize! :create, @user
  end

end

所以在你的控制器中你加載了Group和User對象,它會根據你的規則/能力自動授權它們

can [:create], [User, Group]

當然,您需要將您的組作為嵌套資源:

resources :users do
  resources :groups
end

希望能幫助到你。

我能想到的最好的辦法就是使用多個can? 語句並在失敗時引發AccessDenied 您還應該避免對 model class 進行授權檢查,而是對 model 實例進行授權。 請參閱CanCanCan - 常見錯誤

user = User.new(...)
group = Group.new(...)
raise CanCan::AccessDenied.new(nil, :create, [user, group]) \
  unless can?(:create, user) || can?(:create, group)

AccessDenied.new(nil, ..) -> 第一個參數為nil會導致默認錯誤消息。 康康/例外

我可能會把它移到名為def authorize create_group_or_user!

也就是說,也許你在這個 controller 中做的太多了? 或者,您可以在未經授權的情況下將此 controller 重定向到適當的GroupControllerUserController ,並在這些位置執行適當的授權檢查。

備選方案 2:也許對內容使用accessible_by限制,不要調用authorize! 根本。

暫無
暫無

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

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