Spring security AWT
formLogin().disable() 처리를 해주었기 때문에
PrincipalDetailsService implements UserDetailsService를 때려주는 Filter를 만들어야 한다.
.formLogin().disable() 처리를 해주었기 때문에 UsernamePasswordAuthenticationFilter가 실행될 수 있도록
configure(HttpSecurity http)에서 filter를 등록해주어야 한다.
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
그리고 authenticationManager()를 추가하기 위해서 JwtAuthenticationFilter에서 생성자를 추가해준다.
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final AuthenticationManager authenticationManager;
}
그 후에 로그인을 시도를 위해 실행되는 함수를 추가해준다.
authenticationManager로 로그인 시도를 하면, PrincipalDetailsService가 호출되어 loadUserByUsername() 함수가 실행된다.
3. principalDetails를 세션에 담고
4. JWT 토큰을 만들어서 응답해주면 됨.
// PrincipalDetailsService의 loadUserByUsername() 함수가 실행된 후 정상이면 authentication이 리턴됨.
Authentication authentication = authenticationManager.authenticate(authenticationToken);
authentication 객체가 session 영역에 저장됨 => 로그인이 되었다는 뜻
PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal();
log.info("principal > {}", principal);
attemptAuthentication이 종료되면 아래 함수가 실행됨.
즉, JWT 토큰을 만들어서 request 요청한 사용자에게 JWT 토큰을 response 해주면 됨.
@Override
protected void successfulAuthentication( HttpServletRequest request, HttpServletResponse response,
FilterChain chain, Authentication authResult ) throws IOException, ServletException {
시큐리티가 filter를 가지고 있는데, 그 필터중에 BasicAuthenticationFilter 라는 것이 있음.
권한이나 인증이 필요한 특정 주소를 요청했을 때 위 필터를 무조건 타게 되어있음.
만약에 권한이나 인증이 필요한 주소가 아니라면, 이 필터를 타지 않음
public class JwtAuthorizationFilter extends BasicAuthenticationFilter