
이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.
이전 포스팅에서 사용자가 정의한 로그인 페이지로 로그인 하는 방법을 익혔으니 이번에는 spring security에서 인증절차를 거친 후 커스텀 프로세서를 통해 인증된 사용자를 관리하는 방법과 spring security에서 css와js파일등 인증이 필요없는 리소스 파일들을 security필터를 거치지 않게하는 방법도 알아보겠다.
우선 STS에서 생성한 Spring MVC프로젝트의 폴더구조를 보면 아래와 같다.
webapp - resources
폴더가 웹의 정적리소스 파일들 (이미지,css,js등)을 포함시키는 폴더이다.servlet-context.xml
을 보면
<resources mapping="/resources/**" location="/resources/" />
라고 resources로 들어오는 요청은 스프링에서 관리하지 않겠다는 선언을 한다.security-context.xml
에 아래부분을 추가해주면 된다.<http pattern="/resources/**" security="none"></http>
<intercept-url pattern="/resources/**" access="permitAll" />
를 추가해 모든 사용자의 접근이 가능하게 하면 된다.AuthenticationSuccessHandler
인터페이스 를 상속AuthenticationFailureHandler
인터페이스를 상속ex)인증 성공 후 프로세스
public class UserLoginSuccessHandler implements AuthenticationSuccessHandler{
private static final Logger logger = LoggerFactory.getLogger(UserLoginSuccessHandler.class);
@Override
public void onAuthenticationSuccess(HttpServletRequest req,
HttpServletResponse res, Authentication auth) throws IOException,
ServletException {
// TODO Auto-generated method stub
logger.info(auth.getName());
logger.info(auth.getAuthorities().toString());
logger.info(auth.getDetails().toString());
logger.info(auth.getPrincipal().toString());
for(GrantedAuthority a : auth.getAuthorities()){
logger.info(a.getAuthority());
}
UserDetails u = (UserDetails) auth.getPrincipal();
logger.info(String.valueOf(u.isAccountNonExpired()));
logger.info(String.valueOf(u.isAccountNonLocked()));
logger.info(String.valueOf(u.isCredentialsNonExpired()));
logger.info(String.valueOf(u.isEnabled()));
res.sendRedirect(req.getContextPath()+"/");
}
}
ex)인증 실패 후 프로세스
public class UserLoginFailureHandler implements AuthenticationFailureHandler{
private static final Logger logger = LoggerFactory.getLogger(UserLoginFailureHandler.class);
@Override
public void onAuthenticationFailure(HttpServletRequest req,
HttpServletResponse res, AuthenticationException auth)
throws IOException, ServletException {
// TODO Auto-generated method stub
logger.info(auth.getLocalizedMessage());
logger.info(auth.getMessage());
for(StackTraceElement s : auth.getStackTrace()){
logger.info(s.getClassName());
logger.info(s.getFileName());
logger.info(s.getMethodName());
logger.info(s.getLineNumber()+"");
logger.info(s.isNativeMethod()+"");
}
req.setAttribute("errMsg",auth.getMessage());
req.getRequestDispatcher("/WEB-INF/views/user/loginPage.jsp").forward(req, res);
}
}
security-context.xml
의 <http><form-login>
에 authentication-success-handler-ref="userLoginSuccessHandler"
,authentication-failure-handler-ref="userLoginFailureHandler"
속성 값을 지정하면 된다.authentication-success-handler-ref
는 인증 성공 후 이루어지는 프로세스authentication-failure-handler-ref
는 인증 실패 후 이루어지는 프로세스 이다.authentication-failure-url="/user/loginPage"
를 지정하여 인증 실패 후 이동할 페이지를 지정 할 수도있다.
<beans:bean id="userLoginSuccessHandler"
class="com.min.study.user.service.UserLoginSuccessHandler"></beans:bean>
<beans:bean id="userLoginFailureHandler"
class="com.min.study.user.service.UserLoginFailureHandler"></beans:bean>
authentication-failure-url
이나 default-target-url
등의 속성은 무시되며 인증 프로세스에서 직접 이동할 페이지를 지정해야 한다.소스 확인 : (https://github.com/ParkMinKyu/security)[https://github.com/ParkMinKyu/security]