2017년 8월 2일 수요일

외부 인증 정보를 기반으로 Authentication 처리

자제 로그인처리가 아닌 외부연동을 통한 로그인 선처리가 필요한 경우가 있다.

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);
                    }
                }
            }