[ODOP] 92일차 - AccessDecisionManager, AccessDecisionVoter
![[ODOP] 92일차 - AccessDecisionManager, AccessDecisionVoter](/content/images/size/w1200/2023/08/-----2023-08-01----10.29.26-25.png)
AccessSecisionManager
- 인증 정보, 요청 정보, 권한 정보를 이용해서 사용자의 자원 접근을 허용할 것인지 거부할 것인지를 최종 결정하는 주체
- 여러 개의 Voter 들을 가질 수 있으며 Voter 들로부터 접근허용, 거부, 보류에 해당하는 각각의 값을 리턴받고 판단 및 결정
- 최종 접근 거부 시 예외 발생
접근 결정의 세가지 유형
AffirmativeBased

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

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

- 모든 투표자(Voter)가 만장일치로 접근을 승인해야 하며 그렇지 않은 경우 접근을 거부한다
AccessDecisionVoter
- 권한을 심사하는 클래스
- Voter 가 권한 부여 과정에서 판단하는 자원
- Authentication - 인증 정보 (
user
) - FilterInvocatior - 요청 정보 (
antMatcher("/user")
) - ConfigAttributes - 권한 정보 (
hasRole("USER")
)
- Authentication - 인증 정보 (
- 결정 방식
- ACCESS_GRANTED : 접근 허용
1
- ACCESS_ABSTAIN : 접근 보류
0
- Voter 가 해당 타입의 요청에 대해 결정을 내릴 수 없는 경우
- ACCESS_DENIED : 접근 거부
-1
- ACCESS_GRANTED : 접근 허용
AccessDecisionManager, AccessDecisionVoter 의 흐름

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