私は自分のインターフェース設計を見ていて、がアクセスしたいuser
とを与えられた場合に、ロールベースのアクセス制御を実装するための最も「正しい」方法を決定するのに苦労しています。subject
user
私が見る限り、3つのコアオプションがあります(4番目は最初の3つの粗野化、5番目は4番目の微調整です)。
- が
subject
持つ権限のリストを使用してをクエリしuser
ます-subject.allowAccess(user.getPermissionSet)
- に必要な
user
権限のリストを使用してをクエリしsubject
ます-user.hasPermissionTo(subject.getRequiredPermissions())
- サードパーティにクエリを実行して、権限の共通部分を見つけます-
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
subject
/のいずれかを照会しuser
、「決定」をサードパーティのクラスに委任する- 持って
user
アクセスしようとするとsubject
アクセスが許可されていない場合は、エラーをスローします
私はオプション4に傾いています- フィールドに操作を委託するための呼び出しをsubject
含めるaccessController
フィールドがありますsubject.userMayAccess(User user)
。
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
..しかし、これはさらに質問を引き起こします:
accessController
フィールド対静的クラスである必要があります。- 必要があります
subject
知っている必要とされるどのような権限は、それを表示することができますか? - 召喚に関して、知識の最小の原則はここで
subject.display()
どこに作用しますか?呼び出し元はsubject.display()
、アクセス制御が有効であることを知っている必要がありますか?(subject.display()
最終的な「テンプレートメソッド」はどこにあるか) subject.display()
アクセス制御を管理し、ユーザーが必要な権限を持っていない場合に例外をスローしますか?
この状況で何が「ベストプラクティス」と見なされますか?チェックを実行する責任は実際にどこで発生しますか?
これはどちらかと言えば実装に進む学術的な演習であるため、設計パターンへの参照をいただければ幸いです。