[ODOP] 92일차 - AccessDecisionManager, AccessDecisionVoter

[ODOP] 92일차 - AccessDecisionManager, AccessDecisionVoter

AccessSecisionManager

  • 인증 정보, 요청 정보, 권한 정보를 이용해서 사용자의 자원 접근을 허용할 것인지 거부할 것인지를 최종 결정하는 주체
  • 여러 개의 Voter 들을 가질 수 있으며 Voter 들로부터 접근허용, 거부, 보류에 해당하는 각각의 값을 리턴받고 판단 및 결정
  • 최종 접근 거부 시 예외 발생

접근 결정의 세가지 유형

AffirmativeBased

  • 여러 개의 Voter 클래스 중 하나라도 접근 허가로 결론을 내면 접근 허가로 판단

ConsensusBased

  • 다수표(승인 및 거부) 에 의해 최종 결정을 판단한다
  • 동수일 경우 기본은 접근 허가이나, 설정을 통해 바꿀 수 있다 allowIfEqualGrantedDeniedDecisions 를 false 로 설정할 경우 동수일 때 접근 거부로 결정된다

UnanimousBased

  • 모든 투표자(Voter)가 만장일치로 접근을 승인해야 하며 그렇지 않은 경우 접근을 거부한다

AccessDecisionVoter

  • 권한을 심사하는 클래스
  • Voter 가 권한 부여 과정에서 판단하는 자원
    • Authentication - 인증 정보 (user)
    • FilterInvocatior - 요청 정보 (antMatcher("/user"))
    • ConfigAttributes - 권한 정보 (hasRole("USER"))
  • 결정 방식
    • ACCESS_GRANTED : 접근 허용 1
    • ACCESS_ABSTAIN : 접근 보류 0
      • Voter 가 해당 타입의 요청에 대해 결정을 내릴 수 없는 경우
    • ACCESS_DENIED : 접근 거부 -1

AccessDecisionManager, AccessDecisionVoter 의 흐름

  1. 인가 처리 요청이 들어오면 FilterSecurityInterceptor 는 AccessDecisionManager 에게 인가 처리를 위임한다. 이 때, 인가를 판단하기 위한 자원들도 함께 넘긴다
  2. 위임할 때 받은 인가 판단 자원들을 AccessDecisionVoter 에게 넘겨 권한 인가 심사를 진행한다
  3. 심사에 대한 결과를 리턴한다
    1. 심사에 성공했을 경우 FilterSecurityInterceptor 에게 ACCESS_GRANTED 를 넘긴다
    2. 심사에 실패했을 경우 ACCESS_DENIED 를 리턴하며 AccessDeniedException 을 발생시킨다.