엄지월드

Spring security AWT 본문

java/Spring

Spring security AWT

킨글 2023. 2. 3. 20:43

 

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

 

 

Comments