私は自分のインターフェース設計を見ていて、がアクセスしたいuserとを与えられた場合に、ロールベースのアクセス制御を実装するための最も「正しい」方法を決定するのに苦労しています。subjectuser
私が見る限り、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()アクセス制御を管理し、ユーザーが必要な権限を持っていない場合に例外をスローしますか?
この状況で何が「ベストプラクティス」と見なされますか?チェックを実行する責任は実際にどこで発生しますか?
これはどちらかと言えば実装に進む学術的な演習であるため、設計パターンへの参照をいただければ幸いです。