簡體   English   中英

如何使用CanCanCan授權名稱空間,無模型控制器?

[英]How to authorize namespace, model-less controllers using CanCanCan?

使用CanCanCan授權和檢查命名空間無模型控制器的能力的正確方法是什么?

經過大量的谷歌搜索和閱讀維基,我目前有

#controllers/namespaces/unattacheds_controller.rb
def Namespaces::UnattachedsController
  authorize_resource class: false
  def create 
    # does some stuff
  end
end

#models/ability.rb
def admin 
  can [:create], :namespaces_unattacheds
end

#view/
<%= if can? :create, :namespaces_unattacheds %>
# show a create form to authorized users
<% end %>

這未正確授權控制器。 管理員可以看到條件創建表單,但無權發布到創建操作。

post :create, valid_params
Failure/Error: { it { expect( flash ).to have_content "Successfully created" } 
expected to find text "Successfully created"
got: "You are not authorized to access this page."

在一個示例中,wiki建議為命名空間控制器創建單獨的Ability類。 https://github.com/CanCanCommunity/cancancan/wiki/Admin-Namespace

有沒有更簡單的方法來實現這一目標? 這個應用程序使用了許多命名空間控制器,我真的不想為每個控制器創建一個能力類。

是否有正確的語法來引用Ability類中的命名空間控制器?

can [:create], Namespaces::Unattacheds
can [:create], :namespaces_unattacheds
can [:create], namespaces/unattacheds
????

聽起來您正在設置Namespaces::Unattacheds模型的權限,這意味着您的控制器不需要執行以下操作:

authorize_resource class: false

你的控制器確實有一個型號。 也許它還繼承自ApplicationController? (這是合乎邏輯的事情。)

如果您試圖避免影響某些控制器方法,請only使用/ except子句,如下所述: https//github.com/CanCanCommunity/cancancan/wiki/Authorizing-controller-actions#choosing-actions

我不認為命名空間深度是一個問題,如果它在您的模型和控制器之間匹配。 你只需要load_and_authorize_resource並以適當的形式ability.rb

can [:create], Namespaces::Unattacheds

也許不是最漂亮的解決方案,但我設法通過添加來實現這一目標

skip_authorization_check
before_action { raise CanCan::AccessDenied unless current_user.can?(params[:action].to_sym, ::namespaces_unattacheds) }

如果你這樣做,你可以將你想要的任何東西從這個控制器傳遞給能力等級。

你需要添加罐頭嗎? 方法首先能夠使用此https://github.com/CanCanCommunity/cancancan/wiki/Ability-for-Other-Users

暫無
暫無

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

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