![](/img/trans.png)
[英]How do you authorize access to a page dealed by a controller without corresponding model with Cancancan?
[英]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 重定向到適當的GroupController
或UserController
,並在這些位置執行適當的授權檢查。
備選方案 2:也許對內容使用accessible_by
限制,不要調用authorize!
根本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.