1

プロジェクトの 1 つで、authlogic の上に acl9 を使用しています。私はacl9のアプローチが好きですが、それほど単純ではないことをやろうとしていると思います(不可能とは言えません)。

使いやすさの理由から、インライン管理パネルが必要です。たとえば、リソース オークションとネストされたリソース オークション/入札を取得したとします。通常のユーザーがオークション/1 (1=id) にいる場合、「通常の」もの (説明、価格など) が表示され、同じサイトの特権ユーザーには、オークションを編集するための追加のリンク (= オークション/) が表示されます。 1/編集)。そして、ここから楽しみが始まります。

よく調べていなかったか、場所を間違っていたのかもしれませんが、現在のユーザーが編集操作を許可されているかどうかを判断する方法が見つかりませんでした。明らかに、すべての人にリンクを表示し、編集アクションで通常のユーザーを拒否できますが、それは実行可能なオプションではありません。ここで私を悩ませているのは、情報が既にシステムにあり (以下のaccess_controlブロックを参照)、それを使用する方法が見つからないように見えることです。これは非常に多くのレベルで DRY ではありません。

 access_control do
  allow :privileged, :to => [:index, :show, :edit, :update]
  allow anonymous, :to => [:new, :show, :create]
 end

auctions/1/bids/2/editこれはまったく別のコントローラーにあるため、ユーザーがどの権限を持っているかを判断したい場合はさらに悪化します。

事前にその情報にアクセスしてから、編集用のリンクを表示するかどうかを決定するにはどうすればよいですか? それは(acl9自体を変更せずに)不可能なのですか、それとも十分に調べていませんでしたか?私の要件をよりよく満たす認証プラグインはありますか?

4

1 に答える 1

1

「事前に」アクセスするとはどういう意味ですか?ユーザーごとに異なるテンプレートをレンダリングしたいですか、それともユーザーのアクセス レベルに応じてテンプレートの一部を表示/非表示にする条件をテンプレートに設定したいですか? コードまたはテンプレートに次のようなものを含めるのと同じくらい簡単であるべきだと思います:

if current_user.has_role?(:privileged)  
  # here goes the stuff that should be displayed to privileged user only  
end

テンプレート内の特定のルール セットにアクセスする必要がある場合 (「このユーザーに編集アクションへのアクセスを許可しましたか?」など)、acl9 では実行できません。ビジネスロジックと認証制御をコントローラーに結び付けるのは良くないように思われるため、とにかくそれを行うべきではないと思います-明日コントローラーの名前を変更することにした場合、ロジックは失敗します。しかし、それを解決する方法は 2 つあります。

  1. 役割をより詳細なものに分割します。たとえば、「特権」を「編集者」、「作成者」、「削除者」などに分割します。したがって、これらの小さな規則を使用してアクセス規則を作成し、それらをテンプレートで使用して細かい制御を行うことができます。

  2. 役割チェックをオブジェクトに委任します。これは私がプロジェクトで通常行う方法です。これは、グローバル ロールでのみ動作し、ユーザーが何かを実行できるかどうかをモデルに決定させるif @auction.allows_edit_for?(current_user) {}ためです。たとえば、. acl9 にはいくつかのオーバーライドが必要です。この方法については、以前にここでブログを書いています。

于 2009-12-23T22:22:16.633 に答える