5

ユーザー権限を処理する多くの Rails プラグインがあります。hobo gem の実装には感銘を受けましたが、この機能だけを使用して他の部分を使用できないかどうかはわかりません。GateKeeper は実に巧妙な実装ですが、バグがいくつかありますが、自分で修正できるほど小さいものです。Restful_ACL は、作成をチェックするためのクラスメソッドを提供します。つまり、問題のインスタンスに対してチェックを行うことはできません (スコープ検索を行うかどうかは不明です)。

現在のユーザーが見ることを許可されているものだけを見つける ActiveRecord#find の範囲指定されたバージョンを提供するものが欲しいです。これは、あなたまたはあなたの友人の 1 人が所有するギャラリーにある写真だけを見ることができると言うのに十分なほど堅牢である必要があります。

おまけとして、自分のレコードを別のユーザーまたはギャラリーに関連付けたり、そのようなレコードを作成したりするなど、実行する権利のない作成または更新 (before_* または検証ステップで) を防ぐことができます。

4

4 に答える 4

3

declarative_authorizationプラグインを使用すると、モデル レベルで非常に複雑な認証トリックを実行できます。それにもかかわらず、私自身はrails-authorization-plugin を好みます。これを使用すると、モデル レベルでロールを定義し (例: リソースの所有者など)、コントローラー レベルでパーミッションを定義します (例: リソースの所有者のみ、または管理者はリソースを取得できます)。特にクリーンな REST アプローチを追求している場合は、このアプローチの方がはるかに簡潔です。このようなリクエストがある場合:

GET /posts

実際に返す必要があるのは、現在のユーザーの投稿だけでなく、すべての投稿です。そのためには、別のルートが必要です。

GET /users/:user_id/posts

ここで、:user_id は現在のユーザーの ID に設定されます。次に、この違いを適切なアクションに反映する必要があります。

def index
  user = User.find(params[:user_id]) unless params[:user_id].blank?
  @posts =
   if user
    # get all posts of a user
    user.posts.all
   else
    # get all posts 
    Post.all
   end
end

さて、実際にここにあるのは、「ユーザーのすべての投稿を取得する」と「すべての投稿を取得する」という 2 つの承認コンテキストであり、通常は両方に異なる権限を設定する必要があります (たとえば、「管理者のみがすべての投稿を取得できる」と「のみ」ユーザー自身または管理者は、ユーザーのすべての投稿を取得できます」)。

于 2008-12-08T21:17:24.820 に答える
1

オブジェクトの役割に基づいてオブジェクトのアクセス許可を指定できるようにするための宝石があります。ここで見ることができます: http://github.com/nakajima/roleful/tree/master . before_filterあなたがほのめかしたようなアプローチにはうまくいくでしょう。

ユーザーが何らかの関係を持っているものにのみアクセスできるようにすることについては、Rails アソシエーション プロキシの最有力候補を見ていると思います。Milan Novota のスニペットは気に入っていますが、少し変更したいと思います。

def index
  @posts = user_repo.posts
end

private

def user_repo
  # find_by_id is **much** faster than regular find,
  # plus it just returns nil when there's no record
  if user = User.find_by_id(params[:user_id])
    # returns the association proxy
    user.posts
  else
    # returns the class
    User
  end
end
于 2009-01-01T19:04:29.333 に答える
0

lockdownを確認できます。私はまだこれをプロジェクトに実装していませんが、作業を節約できます。

于 2008-12-08T20:48:14.693 に答える
0

振り返ってみると、ホーボーパターンだけを使用します. これは、最も単純で最も柔軟です。

于 2012-10-10T01:51:51.130 に答える