Zend_Acl で RBAC を作成しようとしています。私が持っている質問は、ユーザーが複数の役割を持つことができるようにしたいということですが、さまざまな役割間の権限の競合を解決する方法がわかりませんか? 許可と拒否の両方がある場合、許可は常に拒否をオーバーライドする必要がありますか? いつものように、私の質問をチェックするために時間を割いていただきありがとうございます。乾杯!
4 に答える
あなたの家のように考えてください。
- 否定する | 人
- 否定する | ロシアの誰か
- 許可する | 家族の一員
- 許可する | 友達
あなたがロシア人について悪い印象を持っているとしましょう。親友がロシア人だからという理由だけで、あなたの家へのアクセスを拒否すべきだと思いますか? いいえ、彼は「友達」の地位を与えられるほどの資質を証明しました。allow は deny IMO をオーバーライドする必要があります。
ロシア人に不快感はありません:P
実装に役割の優先度を追加する必要があります。正確なリソース/権限のペアが複数の役割に存在する場合、最も優先度の高いものを引き受けます。完全に一致するロールがない場合は、より優先度の高いロールが返すものを選択します。
もう 1 つのアプローチは、user123 のようなユーザー ロールを定義することです。
$acl->addRole('user123', array('admin', 'banned'));
複数の親ロールを持つロールの挙動がわからないので、自分で調べてください
セキュリティのベスト プラクティスは、競合が発生した場合に拒否を示します。
そうは言っても、実際の経験から、次の方法でセキュリティを構築します(RBACに関しては):
各ユーザーには一連の権利があります。ユーザー権限はグループ権限に取って代わられる 各ユーザーは 1 つまたは複数のグループ権限を持つことができます 各グループにはアプリケーションの優先レベルがあります。通常、管理者は最後に適用された権利に適用されます。複数のグループを複数の人に適用することはめったにありません。そして、権限を適用する権限を持つほとんどの人は、プライマリ管理者を除いてこれを行うことができません (代わりに、新しいグループを作成します)。私はネガティブ (拒否権を持つグループ) を非常に控えめに使用します。グループ権限を人に適用する際に、システムに競合がないかチェックさせ、それを適用する人に通知します。標準の RBAC ロールに加えて、grant view others、grant edit others などのフラグもあります。
さらに、sha256 セッション トークンなどの他の多くのメカニズムを使用し、データベース テーブルを使用して、アイドル セッション + リプレイ攻撃を一時的にチェックし、個人の IP アドレスを一定に保つように要求します。
どちらのバリエーションも問題ありません。問題は、どちらがより好みですか? 「許可」よりも「拒否」の優先度を高くすると、他の人が何を言おうと関係なく、単一の「拒否」許可が権利を奪うシステムになります。またはその逆も同様です。多くの「拒否」にもかかわらず、許可を与えるでしょう。質問は - あなたのシステムはどのくらい厳格であるべきですか?