Url 인가처리 방식과 매우 흡사하지만 다른점은 이것은 AOP방식이라는 점
interceptor(Advice인가처리) 에서 권한요청을 MapBased에 요청하고 DB에서 메서드방식 권한정보를 가져온다. ->AccessDecisionManager에게 권한정보를 넘긴다.
이전까지 기본 flow를 알아봤다. 이제 이 클래스에 대해 좀더 자세히 알아보자
우리가 필요한 객체를 customMethodSecurityMetadataSource()를 오버라이드 해서 만들면 GlobalMethodSecurityConfiguration이 우리가 만든 객체를 저장해서 우리가 맵기반인가처리를 할수잇도록 도와준다
코드를 파헤쳐 보자.
이것은 위에처럼 bean 들을 생성하는데 customMethodSecurityMetadataSource 이 null이 아니면 특정 List에 담는다.
customMethodSecurityMetadataSource는 DelegationMethodMetadataSource라는 것을 빈으로 생성하는데 이 안에는 앞서 말한 List가 들어있다.
이 의미는 보안처리를 이렇게 하겠다는 뜻
네가지 방식이 하나도 활성화되잇지 않거나 객체로 추가되지 않으면 IllegalStateException 발생
초기화시 customMethodSecurityMetadataSource() 호출
우리가 만든 customMethodSecruty — 에서. MapBasedMethodSecurityMetadataSource 생성해서 리스트에 넣어줌( 이방식으로 보안처릴리를 하겠다는뜻)
우리가 해야할 일은 DB에서 권한정보를 가져와 MapBased에 파싱 시켜주는 부분이고 이후에는 Advisor이 pointcut을 통해 모든 빈을 검사
우리가 저장한 정보들에 맞는 빈을 찾아 프록시로 생성. 그리고 그메서드를 어드바이저로 등록
Map 전달만 해주면 스프링 시큐리티가 파싱하고 프록시생성하고 어드바이저 까지 만들어준다
==> 이방법은 보안 애노테이션도 필요없다/ DB에 권한설정만 잘해주고 포함형태 잘해주고 그걸 map으로 담아 MapBase에 전달해주면 스프링 시큐리티가 알아서 나머지는 처리한다.
MapBased 클래스 생성자에 우리가만든 DB에서 권한정보를 가져와 map으로 묶은 데이터들을 보내준다.
그러면 스프링 시큐리티가 알아서 key-value형태로 파싱하고 모든 빈을 검사해 우리가 보낸 map정보와 비교를 시작한다. 그래서 그 데이터를 기반으로 보안에 해당되는 메서드들에대해 프록시를 만들고 Advice를 만든다.