5

現在、Web アプリケーション (ASP.NET) でユーザー ロールとアクセス許可システムを設計していますが、従来のロール ベースのアクセス制御 (RBAC)に収まらないケースがいくつかあるようです。いくつかの質問を投稿します。それぞれが特定のケースに当てはまります。これは私の 2 番目の質問です (最初の質問はここにあります: Non RBAC User Roles and Permissions System:ching the user's City )。

次のケースがあります: Web アプリケーションにManager ロールを実装する必要があります。ただし、マネージャーは1 つまたは複数の会社(この Web アプリを作成している大きな会社グループ内) に属することができます。たとえば、「A社とB社のマネージャー」、「C社のマネージャー」などがあります。

マネージャーが所属する会社に応じて、マネージャーは特定の操作にアクセスできます。たとえば、マネージャーは自分が所属する会社のクライアントとのみ通信できます。つまり、「A社とB社のマネージャー」は、A社とB社のクライアントとのみ連絡を取ることができ、C社のクライアントとは連絡を取ることができません。また、C社ではなくA社とB社のクライアントの詳細ページを表示することもできます。 .

このケースは RBAC に該当するようです。しかし、実際にはそうではありません。Companies プロパティを持つManagerRole クラスを作成する必要があります。つまり、これは (従来の RBAC のように) アクセス許可のコレクションとしての単なるロールではなく、プロパティを持つロールになります!

これは、プロパティを持つロールの一例にすぎません。他にもあります。たとえば、多くの会社にも属し、他のカスタム プロパティも持つ管理者ロールなどです。

これは、階層またはロール クラスを作成することを意味します。


class Role – base class  
class ManagerRole : Role  
    List Companies  
class AdministratorRole : Role  
    List Companies  
    Other properties

いくつかのシステムで純粋な RBAC とその実装を調査しましたが、それぞれがカスタム プロパティを持つ階層またはロールを特徴とするシステムは見つかりませんでした。RBAC では、ロールは単なるアクセス許可のコレクションです。

ManagerPermission、AdministratorPermission などのプロパティを持つパーミッションを使用してケースをモデル化できますが、これには多くの欠点があります。主な理由は、「A 社と B 社のマネージャー」のような役割をユーザーに直接割り当てることができないことです。ただし、A社とB社のManagerPermissionを含むロールを作成する必要があります...さらに、「マネージャー」は、言語の観点からは「許可」というよりもむしろ「役割」(社内での地位) のようです。

このテーマに関するアイデアや、この分野での経験に感謝します!

ありがとうございました。

4

4 に答える 4

1

最初に、両方の質問は基本的に同じであり、統合する必要があると言いましょう。同じ概念の複数のバリエーションには価値がありません。

基本的な役割に、さらにレベルの任意の差別を追加したいとします。

この種のRBACを実装し、組み込みのインフラストラクチャを利用する機能を維持するには、いくつかの妥協を行い、いくつかのカスタム実装を構築する必要があります。

最初のステップは、役割定義規則を採用することの妥協です。たとえば、ユーザーが「companyA」のロール「manager」に属しているかどうかを判断する場合は、属性、コード、またはサイトマップなどのルールを「manager-companyA」として定義しますIsUserInRole("manager-companyA")

2番目のステップは、これを解析し、階層関係を維持する基盤となるデータソースに適切にクエリを実行できるカスタムRoleProvider実装です。このため、メンテナンス用のカスタムUIを提供する必要があります。

ロールがチェックされるか、正しい形式で出力されるようにするには、少なくともASP.Netで使用されるメソッドを実装する必要があります。

IsUserInRole前に説明したように、慣例を使用して、検証のために構成セグメントに解析する必要がある文字列を取得します。

GetRolesForUserCookieにロールをキャッシュするときに呼び出すことができ、ロールの階層再帰を実行し、すべての順列を出力する必要があります。たとえば、ユーザーはcompanyAとcompanyBのマネージャーであるため、値でGetRolesForUser("user")構成される配列を返し、キャッシュされたロールを利用し、RoleProviderをインタラクティブにポーリングしないasp.netインフラストラクチャで使用する必要があります。manager-companyAmanager-companyB

このタイプのアプローチは、必要なカスタマイズを提供しながら、確立されたASP.NetRBAC機能の最も広い可用性を提供します。

したがって、結論として、期待値を調整したり、既存のインフラストラクチャで可能な限り機能するように要件を再定義したりできる場合は常に、実際に設計、実装、テスト、保守する必要のあるコードが少なくなり、より多くの時間を費やすことができます。インフラストラクチャがまだ確立されていないシステムの他の側面に集中するため。

于 2010-05-15T22:51:40.500 に答える
1

私は現在、自分のバージョンの RBAC ライブラリを実装しようとして苦労しています (コードベース/データベース用に特別に調整しながら、RBAC の内臓を学習するという単純な理由から)。(注: 制約は難しい部分です)!!

私がこれに対処した方法 (まだ完全には実装されていません) は、基本的にユーザーのコレクションであるグループを作成することです。この場合、3 つのグループを作成します。A社、B社、C社に分けて、各ユーザーを適切にグループ(会社)に割り当てます。

次に、マネージャーの役​​割を特定のユーザーに割り当てることができ、グループにも役割を割り当てることができます。一度に多くのユーザーに 1 つのロールを追加できるので、これが気に入っています (DB トランザクション中は非常に高速で、一度キャッシュされるとメモリ フットプリントがはるかに小さくなります)。

したがって、あなたの例では、UI に表示される機関モデル (またはオブジェクト インスタンス) があるとします。それをクリックして「セキュリティ」メニューを選択するだけで、ユーザー/グループ メンバーを追加できるウィンドウが表示されます (Windowns セキュリティと同様)。(グループ) 会社 A を追加し、「読み取り」権限を許可することにより、本質的に、そのグループ内のすべてのユーザーに、その会社とその子オブジェクト (クライアントの連絡先と他の何千ものモデル インスタンス) への読み取りアクセスを許可することになります。

おそらく完璧ではありませんが、これが私がこれまでに見つけた最良の解決策です(ただし、SOで質​​問しようとしている質問がまだあります)。

于 2010-11-24T03:16:25.653 に答える
0

これがあなたが探しているものかどうかはわかりませんが、RBAC システムに関する情報を自分で検索したところ、あなたのニーズに合ったものを見つけたかもしれません。私は Tony Marston の Virtual Private Database/Row Level Security についての記事を読んでいました。これらは、データベース内の情報の特定のサブセットにユーザーを制限できることを意味する、データ レベルでのアクセス許可を与えます。記事へのリンクは以下です。

http://www.tonymarston.net/php-mysql/role-based-access-control.html (ページ下部の「その他のタイプのアクセス制御」セクションを参照)

繰り返しますが、これがあなたが探しているものかどうかはわかりませんが、簡単に閲覧する価値があるかもしれません.

于 2010-05-19T20:20:17.790 に答える
0

ロールの継承を実装することで問題が解決する場合は、それを実装できます。

あなたの例は、属性ベースのアクセス制御方法を使用する別の機会です (たとえば、マネージャーの役​​割を持ち、会社 A で働くユーザーを許可します)。ただし、RBAC システムを実装するのははるかに困難です。

于 2010-05-15T14:52:35.620 に答える