[Spring Security] 로그인 성공 시 Handler 설정하기
지난 포스팅에서 로그인에 실패했을 때의 Handler를 설정 해 보았습니다.
그렇다면 로그인에 성공했을때의 상황에 대해서도 설정을 해봐야겠죠?
해보겠습니다.
0. 로그인 성공 이후 실행 될 내용
1️⃣ DB상의 패스워드 오류 횟수(pwErrCnt) 0으로 초기화
2️⃣ DB상의 마지막 로그인 일자(last_lgn_at) 업데이트
3️⃣ main 화면으로 이동
1. 로그인 성공 핸들러 생성 - LoginSuccessHandler.java
AuthenticationSuccessHandler를 구현한 핸들러를 생성해줍니다.
핸들러 이름은 LoginSuccessHandler로 정했고 역시나 작명은 자기 자유입니다.
@RequiredArgsConstructor
@Component
public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private final MemberRepository memberRepository;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
Member loginMember = memberRepository.findByMemberId(authentication.getName());
loginMember.updatePwErrCnt(0); // 패스워드 입력 오류 횟수 초기화
loginMember.updateLastLgnAt(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); // 최종 로그인 일자 업데이트
memberRepository.save(loginMember);
/**
* session에 사용자 정보 저장
* front에서 ${session.[attributeName]} 으로 사용 가능
*/
HttpSession session = request.getSession();
session.setAttribute("loginId", authentication.getName());
session.setAttribute("loginMemberInfo", loginMember);
setDefaultTargetUrl("/main/mainView");
super.onAuthenticationSuccess(request, response, authentication);
}
}
1️⃣ SimpleUrlAuthenticationSuccessHandler를 extends.
2️⃣ onAuthenticationSuccess() 메소드를 오버라이드.
3️⃣ Authentication 파라미터는 인증된 사용자 정보를 담고있는 객체.
Authentication 메소드 | 설명 |
String getName() | 사용자 ID 반환 |
Collection<> getAuthorities() | 사용자 권한 리스트 반환 |
Object getPrincipal() | UserDetails 객체 반환 |
Object getDetails() | IP, 세션 ID를 가진 WebAuthenticationDetails 객체 반환 |
4️⃣ 패스워드 입력 오류 횟수 초기화 및 최종 로그인시간 업데이트
5️⃣ session에 로그인한 사용자 정보를 담음
6️⃣ main 화면으로 이동
* session에 추가한 loginMemberInfo는 html에서 ${session.loginMemberInfo.get**()} 를 적용하여 사용할 수 있습니다.
예시)
<span th:text="'Logged in as: ' + ${session.loginMemberInfo.getLastLgnAt()}"></span>
<span th:text="'사용자명: ' + ${session.loginMemberInfo.getMemberId()}"></span>
2. 설정 수정 - SecurityConfig.java
실패 핸들러를 설정한것과 동일하게 성공 핸들러를 config 파일에 적용시켜줍니다.
defaultSuccessUrl는 사용하지 않게되므로 제거하셔도 됩니다.
// 로그인 실패 Handler
private final LoginFailHandler loginFailHandler;
// 로그인 성공 Handler
private final LoginSuccessHandler loginSuccessHandler;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.formLogin(login -> login
.loginPage("/member/loginSignUpView") // 로그인 default 페이지
.loginProcessingUrl("/member/login")
.usernameParameter("login_id")
.passwordParameter("login_password")
.successHandler(loginSuccessHandler) // 로그인 성공시 실행 Handler
.failureHandler(loginFailHandler) // 로그인 실패시 실행
.permitAll()
);
}
3. 결과
출처 및 참고
Spring Security 로그인 성공 대응 로직
로그인 직후 어떤 페이지로 보내줄 것인지를 결정하거나 방문자 수를 카운트하는 등의 로직을 작성할 수 있습니다.로그인 인증 성공 후 로직을 전개하는 디폴트 클래스는 아래 인터페이스를 상
velog.io