FilterInvocationSecurityMetadataSource

Shaun·2022년 2월 13일
2

Spring Security

목록 보기
12/19

저번까지 form인증 방법과 Ajax인증 방법을 알아봤다.

이번에는 '인가프로세스 DB연동' 방법을 알아보자

인가프로세스 DB연동

  • 스프링 시큐리티가 인가 처리를 하기위해 필요한 조건
    1.인증정보
    2.요청정보
    3.권한정보

인가프로세스 DB연동 flow

  • 과정은 예전에 하던 방식과 비슷하다. FilterSecurityInterceptor 에서 인증,인가 처리를 한다. 인가처리는 AccessDeniedManager가 담당한다.

  • FilterInvocation = 자원접근시 FilterSecurityInterceptor 에서 처음 이 객체를 만들고(request, response,chain) 저장 => 바로참조가능

  • 우리가 평소에 securityConfig에 설정 할때 처럼 하면 시큐리티가 초기화할때 map형태로 key -value형태로 저장한다

  • user로 자원요청을 하면 권한정보에서는 hasRole(권한) 부분을 List<.ConfigAtturibute>타입에 담아서 반환

결론: Authentication은 인증된 객체로 SecurityContextHolder 에서 꺼내서 참조가능, FilterInvocation 도 바로 참조가능... 권한 정보를 불러오는 부분을 학습해보자!

FilterSecurityInterceptor

  • 저번시간에 배웠던 interceptor를 다시 정리해보자. 우리는 2번 MetadataSource를 구현할 예정이다.
  1. 인증 객체 Authentication에 인증된 객체가 있나 없나 확인후 (인증)

  2. MetadataSource가 클라이언트가 요청한 자원에 필요한 권한을 전달해준다.

  3. AccessDecisionManager가 권한을 확인한다.(인가)

구성도

  • 맨위쪽에는 SecurityMetadataSource 라는 인터페이스가 있고 우리가 antMatcher을 써서 url에 권한 정보를 표시할떄 사용하는 FilterInvocationSecurityMetadataSource 를 학습할 예정이다.

  • FilterInvocationSecurityMetadataSource 인터페이스를 구현한 DefaultFilterInvocationSecurityMetatadataSource가 있고 그 자식 클래스는 부모클래스를 상속 받는다.

  • 자식 클래스, 즉 ExpressionBasedFilterInvocationSecurityMetatadataSource가 우리가 지금까지 antMatcher로 입력한 url 권한정보들을 map형태로 저장한다.

  • filterInterceptor가 두가지면 앞에서 인가처리가 됐으면 뒤에껀 인가 처리를 하지 않는다

  • 권한이 null이면 인가처리를 하지 않고 바로 그다음 필터로 넘어간다.

요청순서

  1. fitlerSecurityInterceptor(인증,인가처리) 에서 FilterInvocaion 을 만들어 (바로참조 가능)
  2. 부모 메서드 getAttrivute 호출(권한정보 확인)
  3. 자식 클래스 에게 권한정보요청.( 자식 클래스가 map형태로 권한정보 다 가지고있으니까.)

ExpressionBasedFilterInvocationSecurityMetatadataSource

  • 클라가 요청한 url 자원과 DB에서 가져온 url 자원이 같으면 권한을 반환하는 메서드가 getAttribute()메서드이다.

  • ExpressionBasesdFilterInvocationSecurityMetadataSoucre 는 필터가 권한목록이 필요하면 그에대한 권한목록을 반환해주는 클래스이다.

실습

  • metadataSource 인터페이스를 구현하는 , 권한정보를 가져와List<.ConfigAtturibute> 타입으로 담아주는 클래스를 만들어보자

  • FilterInvocationSecurityMetadataSource 의 핵심인 getAtturibute를 구현하면 매개변수 타입이 Object 형이다. 그 이유는 url방식 권한정보추출 방식, Method 권한 정보 추출 방식 둘다 SecurityMetadataSource를 구현하기때문에 Object 타입인것이다.

  • url요청과, 그에 해당하는 권한정보를 저장하는곳을 만들어준다.

  • 간단히 말하면 DB에서 요청 URL에 해당하는 정보를 가져온다

  • 가져온값을 key-value쌍으로 만들고 이 데이터의 key값, 즉 URL과 클라이언트가 요청한 request(URL값)이 일치하는지를 보고 일치하면 그에 해당하는 value값, 즉 권한정보를 반환 한다.

  • method 방식도 들어오기때문에 , 구별하기위해 , 타입을 설정해준다.

SecurityConfig 설정

  • 스프링 시큐리티가 우리가 만든 metadataSource를 사용 할수 있도록 Interceptor를 설정해주자.

  • 기존 Interceptor 앞에 위치 시켜준다.

  • 첫번째 그림과 비교해보면 쉽다. 인증 정보를 가져오는 AuthenticationManager 부분과 우리가만든 권한부분, 그리고 그 권한을 심사하는 AccessDecisionManager까지 Interceptor에 배치 시켜준다.

  • accessDecisionManager 생성자에는 매개변수로 List<AccessDecisionVoter<?>>를 받는다. voter를 여러개 전달 하지만 여기서는 하나만 전달하도록 했다.

  • 그 외 우리가만든 metadataSource 생성자이다

  • FactoryBean은 DB 에서 권한 정보를 가져와 map 형태로 묶어주고 metaDataSource를 구현한 클래스에게 전달해준다. 그럼 거기서 사용자가 요청한 자원의 과 db 자원을 비교해 권한정보 추출

profile
호주쉐프에서 개발자까지..

0개의 댓글