내 인터페이스 디자인을 찾고 있어요 내가 역할 기반 액세스 제어를 구현하는 가장 "올바른"방법을 결정하기 위해 고군분투하고, 주어진 user과을 subject(가) 있음 user으로 접근하고 싶습니다.
내가 볼 수있는 한 세 가지 핵심 옵션이 있습니다 (첫 번째는 첫 번째 세 개를 개화하고 다섯 번째는 네 번째를 조정합니다).
- 쿼리
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()사용자가 필요한 권한이없는 예외를 throw, 액세스 제어를 관리?
이 상황에서 "모범 사례"로 간주되는 것은 무엇입니까? 점검 수행에 대한 책임은 실제로 어디에서 발생해야합니까?
이것이 어느 정도 학문적 인 연습이되어 구현으로 진행될 것이기 때문에, 디자인 패턴에 대한 언급은 인정 될 것입니다.