스프링 시큐리티/실전프로젝트 - 인가 프로세스 DB 연동 서비스 계층 구현

ch06. AOP Method 기반 DB 연동 - MapBasedSecurityMetadataSource (3)

webmaster 2022. 1. 26. 13:05
728x90

동작 과정

  • DB로부터 ResourceMap을 만들어 생성자로 MapBaseMethodSecurityMetadataSource에 전달하면 된다.
  • MethodResourcesMapFactoryBean
    • DB부터 얻은 권한/자원 정보를 ResourceMap을 빈으로 생성해서 MapBasedMethodSecurityMetadataSourceMapBasedMethodSecurityMetadataSource 에 전달

초기화 과정

  • DefaultAdvisorAutoProxyCreator가 MethodSecurityMetadataSourceAdvisor를 통해 프락시 객체를 생성한다.
  • MethodSecurityMetadataSourcePointcut이 프락시 생성 대상 클래스 탐색, advice 등록 대상 메소드를 탐색한다.
  • 클래스 정보, 메소드 정보를 MapBaseMethodSecurityMetadataSource에 전달하고, DB를 가지고, 데이터를 생성해 준다.
  • DefaultAdvisorAutoProxyCreator가 이정보를 가지고 프록시 객체를 생성하고 MethodSecurityInterceptor에서 advice로 생성이 된다.

RequestMap 작성

빈으로 등록된 객체를 반환하도록 한다.

  • MethodResourcesFactoryBean을 통해 빈을 생성하도록 한다.
  • public class MethodResourcesFactoryBean implements FactoryBean<LinkedHashMap<String, List<ConfigAttribute>>> {
    
        private SecurityResourceService securityResourceService;
        private LinkedHashMap<String, List<ConfigAttribute>> resourcesMap;
    
        public void setSecurityResourceService(SecurityResourceService securityResourceService) {
            this.securityResourceService = securityResourceService;
        }
    
    
        @Override
        public LinkedHashMap<String, List<ConfigAttribute>> getObject()  {
            //securityResourceService가 Map을 만들어 resourcesMap에 넣어줄 것이다
            if(resourcesMap == null){
                //생성해 주어야한다.
                init();
            }
            return resourcesMap;
        }
    
        private void init() {  //DB로 부터 메핑된 자원을 얻는다
            resourcesMap = securityResourceService.getMethodResourceList();
        }
    
        @Override
        public Class<?> getObjectType() {
            return LinkedHashMap.class;
        }
    
        @Override
        public boolean isSingleton() {
            return FactoryBean.super.isSingleton();
        }
    }
    
728x90