web-dev-qa-db-ja.com

最高の役割ベースのアクセス制御(RBAC)データベースモデル

Webアプリケーションのロールベースのアクセス制御を追跡するのに最適なデータベーススキーマは何ですか?

私はRailsを使用していますが、GoogleによってリンクされたRBACプラグインはメンテナンスされていないようです(SVNへのコミットは300のみ。最新はほぼ1年前です)。

コンセプトはゼロから実装するのに十分単純ですが、複雑で重要なので、正しく理解する価値があります。

では、他の人はどのようにしてRBACモデルを設計および実装するのでしょうか。

41
JasonSmith

その分野での私の基本的な知識として、RBACの基本的なアクターは次のとおりです。

  • リソース。
  • 権限。
  • ユーザー。
  • 役割(グループ)。

Resources <-require->(one or manyPermissions

役割 <-は->のコレクションです(1つまたは複数権限

ユーザー <-は->(1つまたは複数)を持つことができますロール

このようなモデルのテーブルは次のようになります。

  • 許可
  • 役割
  • ユーザー
  • role_permission
  • user_role

アプリケーションのユーザーがリソースに必要なアクセス許可を構成できるようにする場合は、ここにリソースを含めることもできます。しかし、私はそれを必要としませんでした。お役に立てば幸いです。

62
Amr Mostafa

以下に、簡単な図を示します モスタファ氏の優れた答え

enter image description here

21
Hanxue

私はたまたま、ここでRBACサブシステムに取り組んでいます...偶然ですね。

私のモデルは、表示/更新する属性や実行するアクションなど、権限を必要とするシステム内のさまざまなエンティティのビルディングブロックに基づいています。もちろん、システムにはさまざまなroles(ユーザーに与えることができます)もあり、すべてをまとめる接着剤はaccess ruleです。特定の役割、特定の権限が必要なエンティティ、およびpermissionが付与されたものを接続します。アクセスルールは次のようになります。

rule 14: guest role + page name + read permission
rule 46: approver role + add column + execute permission

等々。 ERDは演習として読者に残します;-)質問がある場合はコメントを残してください。

Yuval = 8-)

3
Yuval

Restful ACL Rails plugin を使用できます。

2
IDBD

あなたの質問に対する答えは、あなたが行きたいと思うほど深くなると思います。ロールをグループに入れ、グループをユーザーに関連付けることを考えた場合、それだけでは不十分です。最終的には、特定のオブジェクト(フォーラム、ビデオなど)に対する特定の権限をユーザーに付与する必要があります。

私はYuvalの答えにより近いです。必要なのは、プロジェクト全体のオブジェクト+アクション+ユーザーを関連付けることだけです。これを提供するには;基本オブジェクト(Entity)は完全に理にかなっています。 Entityから継承するオブジェクトはすべて、この方法でユーザー+アクションに簡単に関連付けることができます。

あなたも物事をシンプルに保ちたいので;私の提案は次のようになります。

  • Rbacの制限によるオブジェクトは、ベースエンティティから派生する必要があります。
  • エンティティと1対1で関連付けられているロールのリストがあるはずです。
  • ユーザーとロールの関係のリストがあるはずです。

物事をさらに一歩進めるために、以下もお勧めします(自動rbacの場合)。

  • オブジェクトへのサービスベースのアクセスを使用しています。あれは;オブジェクトのリポジトリを作成し(db-accessを実行します)、サービス機能を介してリポジトリにアクセスします。
  • すべてのサービス関数の最初にカスタム属性を使用しています。これは、その機能にアクセスするために必要な役割を定義します。
  • Userパラメーターを使用してすべてのサービス関数にアクセスし、各サービス関数は自身を実行する前に役割チェックを実行します。リフレクションは、呼び出す関数とその役割の種類(カスタム属性を介して)を理解するのに役立ちます
  • また、アプリケーションの起動時にイニシャライザを実行し、すべての関数(およびそれらの属性)をチェックして、新しい必須ロールを追加したかどうかを確認します。追加したばかりのロールがあり、dbにない場合は、dbに作成します。

しかし、悲しいかな、私が知る限り、これは.NETでのみ使用できますJavaにはカスタム属性がないため、Javaでまだ使用できる可能性は高くありません。

いくつかのコード例を考えたいのですが、それを行うのが面倒です。それでも、私のrbacのやり方について質問があれば、あなたはここに尋ねることができ、私はきっと返信します。

1
detay

ロール要件 は、Restful Authenticationと非常にうまく連携して、ロールベースの認証機能を提供し、十分に維持されます。

0
Yardboy