SPRING/spring security
🌱👮🏿♀️Spring Security (2) - Login Form 인증, FormLoginFilter 동작 순서
개발하는 정복자
2022. 5. 23. 19:33
- 이전 챕터
🌱👮🏿♀️Spring Security (1) - 스프링 시큐리티 시작하기
- FormLoginFilter 동작 순서
- 요청이 오면 인증처리를 담당하는 UsernamePasswordAuthenticationFilter가 작동함
- 이 클레스의 가장 큰 역할은 Username과 password를 저장하는 Authentication이라는 객체를 만들어 실질적으로 인증처리를 맞기는 역할을 한다.
- AntPathRequestMatcher("/login")
- login으로 요청이 왔는지 확인
- 아니면 다음 Filter로~
- Authentication(Username + Password)
- 로그인할때 받은 아이디 비번을 Authentication 객체로 저장
- AuthenticationManager가 인증을 처리하는데 내부의 AuthenticationProvider에게 인증을 위임
- 성공시
- 인증 성공 return하고 Authentication(User + Authorities) 객체에 권한 정보인 Authorities를 추가적으로 담아 보내준다.
- 실패시
- AuthenticationException을 거쳐 1번 과정으로 돌아간다.
- 성공시
- 인증된 Authentication객체는 다시 SecurityContext(전역적으로 인증객체를 잠조할 수 있도록 함, 나중에 session에도 저장됨)객체에 저장
- SuccessHandler 작동
- 코드로 보자!
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
;
http
.formLogin() // formLogin 사용
// .loginPage("/loginPage") // security 에서 제공하는 from login 페이지
// 이외 개발자가 개별적으로 만든 페이지 매핑
.defaultSuccessUrl("/") // 로그인 성공시 이동할 url
.failureUrl("/login") // 로그인 실패시 이동할 url
.usernameParameter("userid") // user 필드명 재설정
.passwordParameter("passwd") // 비밀번호 필드명 재설정
.loginProcessingUrl("/login_proc") // from 태그의 action url 변경 | default : login
.successHandler(new AuthenticationSuccessHandler() { // 로그인 성공시 함수 호출
// AuthenticationSuccessHandler 인터페이스를 구현한 것을 넣으면 된다
@Override
public void onAuthenticationSuccess(
HttpServletRequest request,
HttpServletResponse response,
Authentication authentication
) throws IOException, ServletException {
System.out.println("authentication : " + authentication.getName()); // 인증된 객체의 이름 보여주기
response.sendRedirect("/"); // redirect : url "/"
}
})
.failureHandler(new AuthenticationFailureHandler() { // 로그인 실패시 함수 호출
// AuthenticationFailureHandler 인터페이스를 구현한 것을 넣으면 된다
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception
) throws IOException, ServletException {
System.out.println("exception : " + exception.getMessage()); // 에러 메세지 출력
response.sendRedirect("/login"); // redirect : url "/login"
}
})
.permitAll() // loginPage 의 접근을 인증없이 허용함
;
}
}