[백업][가리사니] spring security oauth 통합 로그인 : 4. 추가사항
java, spring
이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.
Spring Security OAuth 통합 로그인 시리즈
서론
이중 로그인 방지 신기하게도 스프링에서는 로그인 상태에서 재인증이 가능합니다. 즉, abc 라는 id 로 로그인 한 상태이지만, 해당 상태로 def 라는 id로 로그인이 가능합니다. 이 때 스프링 사이클에서는 로그아웃을 부르지 않습니다.
- 즉 abc때 기록해둔 세션들이 def에 남아있을 수 있습니다.
- Authentication 외 다른 곳에 세션을 생성하지 않음으로써 어느정도 위험은 줄어들지만 근본적으로 이중 로그인을 막는 것이 맞다고 생각합니다. 불행하게도 필자는 스프링 사이클에 모든 auth에 관련되 미리실행되는 필터를 찾지 못 했습니다.
때문에 OAuth와 일반 인증 둘을 체크하기위해 별도의 필터를 만들었습니다.
- 필자는 리다이렉트보다 없는 페이지로 보여주는 것을 선호하기 때문에 404를 보냈습니다.
- 방법은 각자 고민해보시기 바랍니다.
public static class DuplicateAuthenticationFilter implements Filter
{
final String prefixUrl;
public DuplicateAuthenticationFilter(String prefixUrl)
{
this.prefixUrl = prefixUrl;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException
{
if ( ((HttpServletRequest)req).getServletPath().startsWith(prefixUrl) )
{
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
// 룰을 하나라도 가지고 있다면 로그인으로 간주
if (auth != null && !auth.getAuthorities().isEmpty())
{
// 404 를 보내준다.
((HttpServletResponse)res).sendError(404);
return;
}
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void destroy()
{
}
}
적용
- 필자는 모든 url을 /sign-in 밑으로 넣었습니다.
- 예를들어 /sign-in (일반), /sign-in/facebook (페이스북), /sign-in/naver (네이버)
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
// 각종 설정 생략
.addFilterBefore(new DuplicateAuthenticationFilter("/sign-in"), BasicAuthenticationFilter.class);
}