Authenticaiton provider 중에서 인증처리 조건에 맞는 provider를 선택해 인증처리 위임
Request에 해당하는 provider가 없으면 자식 ->부모 providerManager 에있는 provider까지 사용 가능, 인증한후에는 자기자신을 호출한 filter에게 결과값을 반환
AuthenticationManagerBuilder 를 사용해서 시큐리티 초기화 과정에서 설정한 기본 Parent 관계를 변경해야 권한필터 재인증시 모든 provider탐색 가능
AuthetnicationProvicder 는 두개의 메서드를 가지고 있다. 하나는 진짜 검증이 일어나는곳 다른하나 서포트. 두번째 메서드는 는 현재 폼인증 입력폼인증같은 인증을 처리할수 있는 조건이나 기준이 잇는지 확인
userDEtailsService 인터페이스에서 사용자 계정이 있는지없는지 확인, 있으면 userDetails 타입으로 변환뒤 authenticationprovider에게 다시전달
패스워드는 유저네임 인증결과 userdetails 타입의 객체의 비밀번호와 사용자가 입력한 비밀번호 비교 (매치할때도 패스워드 인코더 사용)
인증 다 성공하면 다시 authentication 객체에 담아 authenticatinManager 에게전달
- Filter -> AuthenticationManager -> AuthenticationProvider -> AuthenticationManager -> Filter -> securityContext ->session
exceptionTranslaterfilter 가 먼저 받는다. 다음 필터로 이동시 try catch로 해서 본내다. = 그 다음 필터에서 발생하는 모든 예외는 이 catch로 온다 exceptionTranslaterfilter filterinerceptor는 서로 상호보완적
마지막에 있는 필터로써 사용자의 특정 요청에 대한 승인/거부를 최종적으로 결정
인증 객체없이 접근시 AuthenticationException 발생
인증 후 권한이 없으면 AccessDeniedException 발생
권한 처리를 AccessDesicionManager 에게 맡김
SecurityMetadataSource = 사용자가 요청한 자원에 대한 권한정보를 가져온다
AccessDesicionManager = 여기서 사용자의 권한과 사용자가 요청한 자원의 권한비교 ( 사실상 voter에서 심의가 일어남!)
voter 를 직접구현해 새로운 처리방식 만들기 가능
- Authentication -인증정보
- FilterInvocation -요청정보
- ConfigAttributes -권한정보