Steffen Bartsch によるこの記事を読むことに興味があるかもしれません。Ruby on Rails のすべての認証プラグインを要約しており、解決策を見つけるのに役立つと確信しています (この記事は Rails プラグインに関するものですが、概念は Rails の外に簡単にエクスポートできます)。
Steffen は、「Declarative Authorization」と呼ばれる独自のプラグインも構築しました。これは、ニーズに一致するようです。IMHO:
- 一方では、役割を定義します(「訪問者」、「管理者」など)。ユーザーはこれらの役割に (多対多の関係で) 関連付けられています。これらのロールを特権にマップします(ここでも多対多の関係にあります)。各特権は、特定のコンテキストにリンクされています。たとえば、役割「訪問者」は「ドキュメントを読む」権限を持っている場合があります。この例では、「read」が権限であり、「documents」コンテキストに適用されます。
- 注: Steffen のプラグインでは、ロールの階層を定義できます。たとえば、「global_admin」ロールに「document_admin」ロールや「comment_admin」ロールなどを含めたい場合があります。
- 特権の階層を定義することもできます。たとえば、「管理」特権には、「読み取り」、「更新」、「追加」、および「削除」特権を含めることができます。
- 一方、ロールではなく、特権とコンテキストの観点から考えてアプリケーションをコーディングします。たとえば、ドキュメントを表示するアクションは、ユーザーが「ドキュメント」コンテキストで「読む」権限を持っているかどうかのみを確認する必要があります (ユーザーが「訪問者」ロールまたはその他のロールを持っているかどうかを確認する必要はありません)。これにより、コードが大幅に簡素化されます。これは、承認ロジックのほとんどが別の場所で抽出されているためです (おそらく他の誰かによって定義されていることもあります)。
ユーザー ロールの定義とアプリケーション レベルの権限の定義をこのように分離することで、新しいロールを定義するたびにコードが変更されないことが保証されます。たとえば、コントローラーでアクセス制御がどのように見えるかは次のとおりです。
class DocumentController [...]
filter_access_to :display, :require => :read
def display
...
end
end
そしてビュー内:
<html> [...]
<% permitted_to?(:create, :documents) do %>
<%= link_to 'New', new_document_path %>
<% end %>
</html>
Steffen のプラグインでは、オブジェクト レベル (行レベル) のアクセス制御も可能です。たとえば、「document_author」などのロールを定義して、「 documents 」に対する「manage」権限を付与したい場合がありますが、これはユーザーがドキュメントの作成者である場合に限られます。このルールの宣言は、おそらく次のようになります。
role :document_author do
has_permission.on :documents do
to :manage
if_attribute :author => is {user}
end
end
それだけです!次のように、ユーザーが更新できるすべてのドキュメントを取得できるようになりました。
Document.with_permissions_to(:update)
「manage」権限には「update」権限が含まれているため、現在のユーザーが作成者であるドキュメントのリストが返されます。
もちろん、すべてのアプリケーションがこのレベルの柔軟性を必要とするわけではありませんが、あなたの場合はそうかもしれません。