6

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

4

4 に答える 4

3
can :read, :all

ユーザーがアプリのすべてのリソースを読み取る権限を持っていることを意味します。そのはず

can :read, Post

も追加

cannot :manage, :newsroom

ニュースルームにアクセスしたくない場所。アクセス許可を指定する順序は重要です。他の人がすでに述べたように、「load_and_authorize_resource」はオプションです。コントローラーのすべてのアクションを承認するには、「リソースの承認」のみが必要です。これらをスキップすると、個々のコントローラー アクションを「承認」できます。

どうしても必要な場合を除き、アビリティにブロックを使用することは避けてください。たとえば、Post に user_id が含まれている場合、次のことができます。

can :update, Post, user_id: user.id

最後に、「class => false」は、コントローラーをサポートするモデルがない場合に使用されます。つまり、「Newsroom」というモデルはありませんが、「NewsroomsController」というコントローラーがあります。

于 2014-12-20T18:23:51.230 に答える
2

それだけの価値があるため、次のNewsroomControllerようにセットアップする必要がありました。

class NewsroomController < ApplicationController
  authorize_resource :class => false

これは、ability.rb必要なアクセス許可で動作するようになった後の動作バージョンの外観です。

#Roles
#Admin
 if user.has_role? :admin
      can :manage, :all
 # Editor
  elsif user.has_role? :editor
    can :manage, :newsroom
    can :manage, Post
  #Member
  elsif user.has_role? :member
      can [:read, :create, :status], Post
      can :update, Post do |post|
        post.try(:user) == user
      end
  #Guest
  else
      can [:read, :status], Post
  end
于 2014-12-17T22:41:25.300 に答える