6

イントラネット サイトのアクセス制御を実装しています。会社に 200 人以上の従業員がいて、ほぼすべての従業員に独自の権限がなければ、これは簡単なことです。それは狂気です、私は知っていますが、私はそれを変えることはできません.

それで、自分のニーズに合った一般的な実装を見つけようとしましたが、見つからなかったので、自分でやろうとしました。結局、私は考えさせられるかなり一般的な解決策を思いつきました: 誰かが以前にそれをやったに違いない!

私はこれを STOP (Subject Task Object Permission) Access Control と呼びました。私は次の関係を持っています:

.-------.     .-----------.     .-------.
| users |1---*| STOPRules |*---1| tasks |
`-------'     '-----------'     '-------'

STOP ルールには次の属性があります

STOPRule {
    Subject;
    Task;
    ObjectType;
    Permission;
    Relation;
}

オブジェクト関係は、所有者、作成者、改訂者などです。一般的なタスクをサポートするため、このフィールドは必須ではありません。そこにある場合、現在のユーザーとオブジェクト インスタンスの間の関係はデリゲートによって計算されます。次に、現在の関係がルールの必要な関係と比較され、アクセスが許可または拒否されます。

私が十分に明確でない場合はお知らせください。

2 つの疑問が生じます。

  1. このようなオープンソースの実装はありますか?

  2. このパスをたどって遭遇する問題はありますか?

編集:私は先に進み、実際にこのモデルの実装を開始しました。最初の問題は、あらゆるユースケースをサポートするために、サブジェクトとオブジェクトの関係が必要だったことです。これで、次のルールを保存できます。

ジョン(サブジェクト)は、注文 (オブジェクト) の作成者(関係) である場合、注文(オブジェクト)を(許可)編集(タスク)できます。

このモデルでは表現できなかった現実的なユースケースを教えてください。

4

2 に答える 2

1

特定のロールによってグループ化されたアクセス許可を持つ1つのテーブルを実際に持ち、一般的なアクセス許可をオーバーライドする拡張アクセス許可に別のテーブルを使用するのはどうでしょうか。ジョンだけが何かにアクセスできるようにする場合、なぜお互いにアクセスできないと言うのですか?上記のコメントで提供した最後の例のように、権限を持つテーブルがありますか。レコードは次のようになります:1645edit_some_field。その場合、group_permissionsは次のようになります。1645 everyone false最終的な例外テーブルは。になります1645 (Jane Doe's ID) true

このフィールドを編集するためのアクセス権を持つユーザーが50人いるとすると、グループテーブルに次のような別のグループを追加するだけです。、ユーザー89 editors_of_field_XのIDをのgroup_membersようなテーブルに配置します89 (John Smith's ID) true。そして最後のステップで、私が上で述べたように、あなたは一人の許可を持つものを上書きすることができます。したがって、結論として、3層スキームがあります。みんな-グループ-人。そして、深く行くほど、その役割の重要性は高くなります。たとえば、全員が許可されていないが、所属しているグループが許可されている場合は、何かを編集できます。

さらに、サードパーソンレベルでのアクセスが許可されていない場合は、グループ内で例外になります。このようにして、小さな変更を追加するだけで、後でグループを再利用できるようになります。

于 2012-05-28T00:46:32.653 に答える
1

John が注文を作成し、Bob にそれを表示させたいと考えています。

于 2012-05-28T03:33:24.630 に答える