자제 로그인처리가 아닌 외부연동을 통한 로그인 선처리가 필요한 경우가 있다.
spring security를 사용하여 인증 처리를 하던 프로젝트의 경우 어떤 부분을 건들여야 할지 애매모호한 부분이 있다.
해당 기능 처리를 위해서 본인은 filter를 이용하여 BasicAuthenticationFilter가 실행되기 전에 전처리로 해당 세션에 authentication 정보를 주입하는 방식으로 처리를 하였다.
선처리 filter 코드 일부
1.해당 context에 인증 정보가 있는지 체크 (현재 인증된 정보가 있으면 스킵)
2.인증 정보를 연동 및 습득
3.해당 정보 기반으로 현재 context 인증 정보를 입력(인증은 security의 Authentication interface 기반으로 필요한 구현체로 선택해서 결정)
if(!SecurityContextHolder.getContext().getAuthentication().isAuthenticated()){
Map<String,Object> loginInfo = (Map<String,Object>)request.getSession().getAttribute("loginInfo");
if(loginInfo !=null){
LoginOperator loginOperator = loginService.searchLoginOperator((String)loginInfo.get("oprtrId"));
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
Collection<? extends GrantedAuthority> authorities = getAuthorities();
if(loginOperator !=null){
Authentication authentication = new UsernamePasswordAuthenticationToken(new LoginUser(
String.valueOf(loginOperator.getLoginId()),
loginOperator.getLoginPassword(),
enabled,
accountNonExpired,
credentialsNonExpired,
accountNonLocked,
getAuthorities(),
new ArrayList<String>(),
loginOperator.getOperatorNumber(),
loginOperator.getLoginId(),
loginOperator.getOperatorName()
), loginOperator.getLoginPassword(), authorities);
//
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}