我對如何正確配置CanCanCan有點困惑。如何正確設置我的CanCanCan權限?
對於初學者,我必須將load_and_authorize_resource
添加到我想限制訪問的每個控制器資源嗎?
這是我想要做什麼:
- 管理員可以管理和訪問所有控制器和動作
- 編輯器可以讀取所有,管理:編輯部,並能管理所有帖子
- 成員都可以閱讀每一篇文章,並可以創建&更新文章(不編輯/刪除/其他任何內容),不能訪問新聞編輯室。我們業務規則中的更新&編輯帖子之間的區別在於更新正在創建一個新帖子,該帖子是當前帖子的子帖子。所以這不是一個編輯。只是一個祖先協會的新紀錄。
- 訪客可以閱讀每篇文章,但無法創建文章或訪問新聞室。
這是我ability.rb
是什麼樣子:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
#Admin
if user.has_role? :admin
can :manage, :all
can :manage, :newsroom
# Editor
elsif user.has_role? :editor
can :read, :all
can :manage, :newsroom
can :manage, Post
#Member
elsif user.has_role? :member
can :read, :all
can :create, Post
can :status, Post
can :update, Post do |post|
post.try(:user) == user
end
#Guest
else
can :read, :all
can :create, Post
can :status, Post
end
end
end
在我routes.rb
我有這樣的:
authenticate :user, lambda { |u| u.has_role? :admin or :editor } do
get 'newsroom', to: 'newsroom#index', as: "newsroom"
get 'newsroom/published', to: 'newsroom#published'
get 'newsroom/unpublished', to: 'newsroom#unpublished'
end
什麼,雖然發生的事情,當我登錄與用戶是尚未分配任何角色(即我想成爲「訪客」),他們可以訪問新聞室。
當我嘗試編輯角色爲:member
的帖子時,它給了我一個「未授權編輯帖子」的錯誤(這是正確的)。
我只是不能完全鎖定Newsroom
,我不知道爲什麼。
此外,@marcamillion可以擺脫路由中的身份驗證,因爲CanCanCan會拒絕訪問新聞編輯室,如果can:read::all被從Guest刪除。很好地消除重複。 – Tim 2014-12-16 08:29:59
我希望'Guest'能夠讀取所有帖子,創建帖子和狀態帖子。但我不希望他們能夠訪問'Newsroom',我不希望他們能夠編輯/更新/刪除任何'Post'。 – marcamillion 2014-12-17 21:37:57