저번까지 form인증 방법과 Ajax인증 방법을 알아봤다.
이번에는 '인가프로세스 DB연동' 방법을 알아보자
- 스프링 시큐리티가 인가 처리를 하기위해 필요한 조건
1.인증정보
2.요청정보
3.권한정보
과정은 예전에 하던 방식과 비슷하다. FilterSecurityInterceptor 에서 인증,인가 처리를 한다. 인가처리는 AccessDeniedManager가 담당한다.
FilterInvocation = 자원접근시 FilterSecurityInterceptor 에서 처음 이 객체를 만들고(request, response,chain) 저장 => 바로참조가능
우리가 평소에 securityConfig에 설정 할때 처럼 하면 시큐리티가 초기화할때 map형태로 key -value형태로 저장한다
user로 자원요청을 하면 권한정보에서는 hasRole(권한) 부분을 List<.ConfigAtturibute>타입에 담아서 반환
결론: Authentication은 인증된 객체로 SecurityContextHolder 에서 꺼내서 참조가능, FilterInvocation 도 바로 참조가능... 권한 정보를 불러오는 부분을 학습해보자!
인증 객체 Authentication에 인증된 객체가 있나 없나 확인후 (인증)
MetadataSource가 클라이언트가 요청한 자원에 필요한 권한을 전달해준다.
AccessDecisionManager가 권한을 확인한다.(인가)
맨위쪽에는 SecurityMetadataSource 라는 인터페이스가 있고 우리가 antMatcher을 써서 url에 권한 정보를 표시할떄 사용하는 FilterInvocationSecurityMetadataSource 를 학습할 예정이다.
FilterInvocationSecurityMetadataSource 인터페이스를 구현한 DefaultFilterInvocationSecurityMetatadataSource가 있고 그 자식 클래스는 부모클래스를 상속 받는다.
자식 클래스, 즉 ExpressionBasedFilterInvocationSecurityMetatadataSource가 우리가 지금까지 antMatcher로 입력한 url 권한정보들을 map형태로 저장한다.
filterInterceptor가 두가지면 앞에서 인가처리가 됐으면 뒤에껀 인가 처리를 하지 않는다
권한이 null이면 인가처리를 하지 않고 바로 그다음 필터로 넘어간다.
- fitlerSecurityInterceptor(인증,인가처리) 에서 FilterInvocaion 을 만들어 (바로참조 가능)
- 부모 메서드 getAttrivute 호출(권한정보 확인)
- 자식 클래스 에게 권한정보요청.( 자식 클래스가 map형태로 권한정보 다 가지고있으니까.)
클라가 요청한 url 자원과 DB에서 가져온 url 자원이 같으면 권한을 반환하는 메서드가 getAttribute()메서드이다.
ExpressionBasesdFilterInvocationSecurityMetadataSoucre 는 필터가 권한목록이 필요하면 그에대한 권한목록을 반환해주는 클래스이다.
간단히 말하면 DB에서 요청 URL에 해당하는 정보를 가져온다
가져온값을 key-value쌍으로 만들고 이 데이터의 key값, 즉 URL과 클라이언트가 요청한 request(URL값)이 일치하는지를 보고 일치하면 그에 해당하는 value값, 즉 권한정보를 반환 한다.
그 외 우리가만든 metadataSource 생성자이다
FactoryBean은 DB 에서 권한 정보를 가져와 map 형태로 묶어주고 metaDataSource를 구현한 클래스에게 전달해준다. 그럼 거기서 사용자가 요청한 자원의 과 db 자원을 비교해 권한정보 추출