2

declarative_authorization を使用して Rails3 コントローラーを保護しようとしています。

コントローラーには、7 つの RESTful アクション、3 つのカスタム メンバー アクション (アクティブ化、非アクティブ化、コピー)、および 1 つのカスタム コレクション アクション (パブリック) があります。ただし、'public' アクションは 1 つのレコードしか返しません。

認証されたユーザーは、カスタム コレクション アクション (パブリック) のみを使用できる必要があります。残りは current_user のみが利用できます。

has_permission_on :foos, :to =>  :public
has_permission_on :foos, :to =>  [:full_control, :copy, :activate, :deactivate] do
  if_attribute :user => is {user}
end

privilege :full_control, :includes => [:index, :show, :new, :create, :edit, :update, :destroy]

4 つのカスタム アクションは、routes.rb ファイルで定義されています。

resources :users do
  resources :foos do
    collection do 
      get :public
    end
    member do
      post :activate, :copy, :deactivate
    end
  end
end

ユーザー :has_many Foos; Foo :belongs_to はユーザーです。

FoosController で定義されている「標準」アクセス制御 (filter_resource_access :nested_in => :user) は、7 つの RESTful アクションへのアクセスを制御しているように見えますが、他の 4 つのアクションへのアクセスを制御できません (予想どおり)。

FooController を次のように変更すると:

filter_access_to :all, :nested_in => :users, :attribute_check => true

「ID なしで Foo が見つかりませんでした」というエラーが表示されます。

質問:

  1. ドキュメントは、filter_access_to が使用されている場合、Foo モデルをロードするために :before_filter が自動的に呼び出されることを示唆しているようです。私は間違っていますか?filter_access_to の追加構成が必要ですか? :before_filter を手動で構成する必要がありますか?
  2. 私の目的のためにモデルに using_access_control を追加する必要がありますか? コントローラーにアクセス制御がある場合、いつモデルにアクセス制御を追加する必要があるのか​​ 少しわかりません。
  3. ドキュメントには、'create' という名前の特権が記載されています。これは次のように定義されています: 特権 :create, :includes => :new. さらに、:new アクションに加えて、この特権には、その名前の結果として :create アクションが自動的に含まれますか?
  4. authentication_rules.rb ファイルが変更された場合、新しいルールを適用するためにサーバーを再起動する必要がありますか?
4

1 に答える 1

0

自動ビフォアフィルターが存在する場合、それはかなり制限されていると思います。コンテキストに応じて、フィルターの前に自分で作成する必要がありました。たとえば、インデックスビューの場合、モデルのすべてのインスタンスで権限が同じでない限り、現在のコンテキストに適したモデルインスタンスを用意する必要があります。投稿のインデックスを表示しているユーザーのように、ユーザーのダミーの新しい投稿を作成するか、最初の投稿をロードしますが、最初の投稿が存在しない可能性があるため、ダミーの方が安全です。通常、私はインデックス用のダミーコンストラクターを持っており、他のすべてのものは実際に見られる(または触れられる)ものをすべてテストできます。

これまでのところ、コントローラーは十分に優れているので、モデルレベルは確かに必要ありません。それが安全性を増やさないというわけではありませんが、それがいつ重要になるかについては私は専門家ではありません。多くのコントローラー(モードレスコントローラーなど)がモデルに触れていて、何も潜入していないことを確認したい場合だと思います。

私は特権を使ったことがないのでわかりませんが、あなたが説明する魔法の継承は起こらないと思います。特に要求されていない権限を作成することは、非常にずさんなアプローチのようです。

いいえ、再起動は必要ありません。少なくとも開発モードでは必要ありません。

于 2012-05-24T21:56:17.673 に答える