환경
Spring 4.3.1.RELEASE
Spring Security 4.1.2.RELEASE
Stack overflow 및 몇가지 자료를 참고하면 아래와 같이 구현을 한면 되다고 한다.
How to pass an additional parameter with spring security login page
- UsernamePasswordAuthenticationFilter 를 확장하여 사용자 정의 필터를 구현.
 - 사용자 정의 UserDetailsService 구현.
 - <http/> 설정에 사용자 정의 필터를 추가
 
SpringSecurity 4.1 이상의 환경에서는 필터를 수정하지 않고 RequestContextFilter 를 사용하여 사용자 정의 AuthenticationProvider 구현체에서 RequestContextHolder 를 사용하여 로그인시에 전달된 추가적인 파라메터 값을 꺼내어 원하는 방법으로 인증을 구현하면 된다.
RequestContextFilter 필터는 web.xml 에 필터 설정을 추가하여 사용할 수 있다.
WEB-INF/web.xml
requestContextFilter org.springframework.web.filter.RequestContextFilter requestContextFilter /* springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* 
또는 Spring Security 설정 컨텍스트 ( 문서에서는 WEB-INF/context-config/securitySubsystemContext.xml 사용함 ) 에 아래와 같이 필터를 추가한다.
WEB-INF/context-config/securitySubsystemContext.xml
     
             
     
     
     
사용자 정의 인증 구현에서는 아래와 같이 RequestContextHolder 클래스를 사용하여 클라이언트에서 전달된 파라메터 값을 접근할 수 있다.
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();  
    if( attr!=null && attr.getRequest() != null ) {
        long companyId = ParamUtils.getLongParameter(attr.getRequest(), "companyId", 0L);
        return super.retrieveUser(companyId, username, authentication);
    }else{  
        return super.retrieveUser(username, authentication);
    }
참고자료
Spring 기반 웹 프로그램 개발 Part 2 - SpringSecurity 사용하기
댓글 없음:
댓글 쓰기