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
理由がわかりません。