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

ch04. 웹 기반 인가처리 DB 연동 - FilterInvocationSecurityMetadataSource (1)

webmaster 2022. 1. 24. 10:39
728x90

  • 사용자가 접근하고자 하는 Url 자원에 대한 권한 정보 추출
  • AccessDecisionManager에게 전달하여 인가처리 수행
  • DB로부터 자원 및 권한 정보를 매핑하여 Map객체로 관리
  • 사용자의 매 요청마다 요청정보에 매핑된 권한 정보 확인

동작과정

  • 사용자의 요청을 FilterSecurityInterceptor가 받는다.
  • 권한정보를권한 정보를 추출하기 위해 우리가 작성한 FilterInvocationSecurityMetadataSource에서 권한 정보를 추출한다.
    • DB에서 정보를 얻어 자원/권한에 매칭되도록 Map으로 저장한 뒤 권한 목록을 다시 Filter에 반환한다.
  • Filter 추가
    • FilterSecurityInterceptor 전에 내가 만든 Filter를 동작시킨다.

      • 내가 만든 MetaDataSource 
      • AcessManagerDecistion
  • public class UrlFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
    
        private LinkedHashMap<RequestMatcher, List<ConfigAttribute>> requestMap = new LinkedHashMap<>();//자원 / 권한List
    
    
    
        @Override
        public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
            //object = FilterInvocation
            HttpServletRequest request = ((FilterInvocation) object).getRequest();//사용자의 요청정보 추출
    
            //DB에서 읽어오는 것이 아닌 내가 직접 데이터를 넣는다.
            requestMap.put(new AntPathRequestMatcher("/mypage"), Arrays.asList(new SecurityConfig("ROLE_USER")));
    
            if(requestMap != null){
                for(Map.Entry<RequestMatcher, List<ConfigAttribute>> entry : requestMap.entrySet()) {
                    RequestMatcher matcher = entry.getKey();
                    if (matcher.matches(request)) {//사용자의 요청정보랑 Map에 존재하는 URL과 일치하는지를 본다
                        return entry.getValue(); //null이 아니기 떄문에 인가 처리를 진행한다.
                    }
                }
            }
            return null; //Null을 리턴하여 더이상 인가 처리를 하지 않는다.(AbstractSecurityInterceptor)
        }
    
        @Override
        public Collection<ConfigAttribute> getAllConfigAttributes() {
            Set<ConfigAttribute> allAttributes = new HashSet<>();
            for (Map.Entry<RequestMatcher, List<ConfigAttribute>> entry : requestMap
                    .entrySet()) {
                allAttributes.addAll(entry.getValue());
            }
            return allAttributes;
        }
    
        @Override
        public boolean supports(Class<?> clazz) {
            //타입 검사
            return FilterInvocation.class.isAssignableFrom(clazz);
        }
    }
    
  • 동작과정 총 정리
728x90