내 인터페이스 디자인을 찾고 있어요 내가 역할 기반 액세스 제어를 구현하는 가장 "올바른"방법을 결정하기 위해 고군분투하고, 주어진 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, 액세스 제어를 관리?
이 상황에서 "모범 사례"로 간주되는 것은 무엇입니까? 점검 수행에 대한 책임은 실제로 어디에서 발생해야합니까?
이것이 어느 정도 학문적 인 연습이되어 구현으로 진행될 것이기 때문에, 디자인 패턴에 대한 언급은 인정 될 것입니다.