액세스 제어 표준 설계 (디자인 패턴)


9

내 인터페이스 디자인을 찾고 있어요 내가 역할 기반 액세스 제어를 구현하는 가장 "올바른"방법을 결정하기 위해 고군분투하고, 주어진 user과을 subject(가) 있음 user으로 접근하고 싶습니다.


내가 볼 수있는 한 세 가지 핵심 옵션이 있습니다 (첫 번째는 첫 번째 세 개를 개화하고 다섯 번째는 네 번째를 조정합니다).

  1. 쿼리 subject(가) 것을 사용 권한 목록이 user있습니다 -subject.allowAccess(user.getPermissionSet)
  2. 필요한 user권한 목록을 사용하여 쿼리 subject-user.hasPermissionTo(subject.getRequiredPermissions())
  3. 권한의 교차점을 찾기 위해 타사에 문의- accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
  4. "결정"을 타사 클래스에 위임하면서 subject/를 쿼리하십시오.user
  5. 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, 액세스 제어를 관리?

이 상황에서 "모범 사례"로 간주되는 것은 무엇입니까? 점검 수행에 대한 책임은 실제로 어디에서 발생해야합니까?

이것이 어느 정도 학문적 인 연습이되어 구현으로 진행될 것이기 때문에, 디자인 패턴에 대한 언급은 인정 될 것입니다.

답변:


7

가장 좋은 방법은 인터셉터 패턴이라는 것을 사용하여 보호 된 영역에 대한 호출을 가로채는 것입니다.

이는 액세스 진입 점에 적용된 AOP 또는 교차 절단 문제를 사용하여 달성 할 수 있습니다.

대상은 볼 수있는 사람을 절대 알 수 없습니다. 이로 인해 주제 코드가 불필요하게 복잡해 지므로 실수로 동일한 기능에 직접 액세스 메커니즘을 제공하지 않는 한 코드를 요구할 이유가 없습니다.

바람직하게는 발신자와 수신자는 거부를 처리하는 것 외에 액세스에 대해 알지 않아야한다. 그러나 문제는 구현중인 시스템 및 발신자의 보안 자격 증명 / 주체에 액세스하는 방법에 따라 다릅니다. 예를 들어, SOAP 시스템에서이 정보는 SOAP 메시지의 헤더에 추가되는 반면, Windows 시스템에서는 Windows 인증 메커니즘을 통해 사용할 수 있습니다.

AOP 또는 인터셉터 패턴 접근 방식을 사용하는 경우 필요한 예외가 발생하며, 예외를 처리하는 것은 클라이언트 (호출자)에게 달려 있습니다.

이러한 방식으로 지식, 기능을 혼합하지 않고도 클라이언트, 서비스 및 인증 코드를 분리 할 수 ​​있습니다.



2

나는 당신의 옵션 3은 가장 가까운, 대신 심문을 생각 user하고 subject자신의 권한 집합에 대해 당신이를 통과해야 user하고 subject액세스 컨트롤러에.

class Subject {
    public function display(user) {
        if(!accessController.checkAccess(this, user, AccessControl.Read)) {
            display403(); //Or other.. eg, throw an error..
        }
    }
}

액세스 컨트롤러는 권한 집합을 가져오고 액세스가 충분한 지 확인해야합니다. 이렇게하면 액세스 컨트롤러에서 스토리지 로직과 검사 로직을 모두 격리 할 수 ​​있습니다 (사용자 및 주제 모두 별도).

예제에서 누락 된 다른 요소는 작업이 수행되는 것입니다. 당신이해야 할 수도 있습니다 그래서 일부 사용자 등, 업데이트로 일부 데이터가 아니라 읽기, 삭제, 실행 할 수있는 권리가있을 수 있습니다 checkAccess세 가지 매개 변수를 사용하여 액세스 컨트롤러 방법 : user, subject, operation. checkAccess액세스 권한이 부여되지 않은 이유에 대한 정보를 반환 하기 위해 추가 정보를 제공 할 수도 있습니다 .

예를 들어,이 모든 것을 액세스 컨트롤러에 위임하면 나중에 권한이 표시되는 방식을 바꿀 수 있습니다. 역할 기반 액세스 제어로 시작하여 나중에 클레임 기반으로 이동할 수 있습니다. 계층 구조 그룹 / 역할을 시작하고 나중에 다른 유형의 주제에 허용되는 조작을 추가하기 위해 권한을 간단한 구조로 저장할 수 있습니다. 권한 집합을 인터페이스에 넣지 않으면이를 활성화하는 데 도움이됩니다.

내 의견으로는 AOP 또는 상용구 코드를 사용하는지 여부는 중요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.