
AccessDecisionManager 클래스
-- 인증 정보, 요청 정보, 권한정보 세 가지 파라메터를 전달 받아
현재 사용자가 해당 자원에 접근을 허용할 것인지 거부할 것인지 결정하는 클래스 최종 결정하는 클래스이다
-- 여러개의 voter 클래스를 가질 수 있다.
-- 자원 접근에 대한 허용, 거부, 보류에 해당하는 리턴을 받고 판단 및 결정
-- 최종 접근 거부 시 예외 발생
-- 접근 결정의 세 가지 유형
1) AffirmativeBased
여러개의 Voter 클래스 중 하나라도 접근 허가로 결론을 내면 접근 허가로 판단한다
2) ConsensusBased
-- 다수표(승인 및 거부)에 의해 최종 결정을 판단
-- 동수일 경우 기본은 접근허가나 allowlfEqualGrantedDeniedDecisions를 false로 설정할 경우 접근 거부로 결정된다.
3) UnanimousBased
-- 모든 보터가 만장일치로 접근을 승인해야 하며 그렇지 않은 경우 접근을 거부한다.
--------------- AccessDecisionVoter -------------

실질적으로 사용자 요청에대해서 자원에 접근할 자격이 있는지 판단하는 위원.
Voter가 권한 부여 과정에서 판단하는 자료
1. Authentication - 인증 정보(user)
2. FilterInvocation - 요청 정보(requestMatcher("/user"))
3. ConfigAttributes - 권한 정보(hasRole("USER"))
결정 방식
-- ACCESS_GRANTED : 접근 허용
-- ACCESS_DENIED : 접근 거부
-- ACCESS_ABSTAIN : 접근 보류
-- Voter가 해당 타입의 요청에 대해 결정으 내릴 수 없는 경우
-----------------작동 순서------------------

FilterSecurityInterceptor가 AccessDecisionManager에게 인가처리를 맡긴다
FilterSecurityInterceptor가 AccessDecisionManager에게 세가지 정보 파라메터를 넘긴다
[authentication, object, configAttributes)
AccessDecisionManager는 인증 정보, 요청 정보, 권한 정보를 넘기면서 AccessDecisionVoter 에게 권한 판단 심사를 맡긴다.
AccessDecisionVoter들은 이 값들을 바탕으로 허용 또는 금지, 보류 결정을 리턴한다.
거부가 되면? ACCESS_DENIED 결정 EXCEPTIONTRANSLATIONFILTER가 예외처리한다.