JwtFilter 인증 계층을 추가하여 보자
JwtFilter 클래스를 만든다
@RequiredArgsConstructor
public class JwtFilter extends OncePerRequestFilter {
private final UserService userService;
private final String secretKey;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// UserId 토큰에서 꺼내기
String userId = "";
// 권환부여
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(userId, null, List.of(new SimpleGrantedAuthority("USER")));
// Detail을 넣어줍니다
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request, response);
}
}
JwtFilter 클래스를 만들고 OncePerRequestFilter
를 상속받는다
OncePerRequestFilter -> HTTP Request의 한번의 요청에 대해 한번만 실행하는 Filter이다
불필요한 로직이 실행되는 것을 방지
@RequiredArgsConstructor
어노테이션을 사용하여
UserService, secretKey를 받아온다
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final UserService userService;
@Value("${jwt.secret}")
private String secretKey;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests(
auth -> auth
.requestMatchers(
HttpMethod.POST,
"/api/auth/signUp",
"/api/auth/login"
).permitAll()
.requestMatchers(HttpMethod.POST, "/**").authenticated()
.anyRequest().permitAll()
)
.csrf(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.cors(Customizer.withDefaults())
.addFilterBefore(new JwtFilter(userService, secretKey), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
UserService를 @RequiredArgsConstructor
어노테이션을 사용하여 의존성 주입을 해주고
.addFilterBefore()
안에 자신이 만든 jwtFilter 클래스와 UsernamePasswordAuthenticationFilter
를 넣어 Filter를 추가해준다
.requestMatchers(HttpMethod.POST, "/**").authenticated()
다음과 같이 token 인증을 해야하는 uri 경로의 요청 경로를 열어준 것이다