1. SecurityConfig를 작성해준다.
addFilterBefore 구문으로 jwtFilter가 SecurityContextHolderAwareRequestFilter보다 먼저 실행된다.
jwtFilter에 /auth 로 시작하면 다음 필터로 이동하는데 이 설정대로 확인을 하게 된다.
기존에 jwtFilter가 jwt토큰에서 역할을 뽑아 확인하던 내용들은 제거하고 SecurityContextHolderAwareRequestFilter에서 처리하도록 설정했다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/**").permitAll()
.requestMatchers("/admin/users/**").hasRole("ADMIN")
.requestMatchers("/**").hasRole("USER")
.anyRequest().authenticated()
)
.build();
}
2. JwtFilter를 bean으로 등록해준다.(SecurityConfig에서 JwtFilter를 등록하는 과정에서 빈 등록이 필요했다.)
>> FilterConfig도 Spring Security에서는 필터관리를 SecurityConfig에서 해줄 거기 때문에 중복 된다고 생각되어서 지웠다.
3. 기존에 사용하던 AuthUserArgumentResolver를 제거한다.
>> 기존에 여기서 사용하던 AuthUser 클래스를 Spring Security 방식으로 활용하기 위해 implements UserDetails 추가해준다.(getAuthorities, getPassword 메소드를 오버라이딩 해줌)
[Spring] ArgumentResolver란? + 유저 정보 넘겨주기
[Spring] ArgumentResolver란? + 유저 정보 넘겨주기
ArgumentResolver란?컨트롤러로 들어온 파라미터를 가공, 수정하기 위한 것이다.HandlerMethodArgumentResolver를 구현한다. 보통 여태까지의 코드들은 컨트롤러에서 유저아이디를 꺼내왔었지만 ArgumentResolve
heehyun0221.tistory.com
4. WebConfig 도 제거한다.
>> 해당 내용은 AuthUserArgumentResolver를 등록하기 위함으로 2번에서 이것을 제거했기 때문에 필요없다.
5. JwtFilter의 상당 부분이 필요가 없어졌다.
기존 코드
httpRequest.setAttribute("userId", userId);
httpRequest.setAttribute("username", username);
httpRequest.setAttribute("email", email);
httpRequest.setAttribute("userRole", userRole);
if (url.startsWith("/admin")) {
// 관리자 권한이 없는 경우 403을 반환합니다.
if (!UserRole.ADMIN.equals(userRole)) {
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자 권한이 없습니다.");
return;
}
chain.doFilter(request, response);
return;
}
변경된 코드
Long userId = Long.parseLong(claims.getSubject());
String username = (String) claims.get("username");
UserRole userRole = UserRole.valueOf(claims.get("userRole", String.class));
String email = (String) claims.get("email");
AuthUser user = new AuthUser(userId, email, username, userRole);
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()));
'Spring' 카테고리의 다른 글
RequestDto에서 @NotBlank시 Error 발생 (0) | 2025.03.27 |
---|---|
Spring Event - 최종 프로젝트 관련 내용 포함 (0) | 2025.03.27 |
[Spring] ArgumentResolver란? + 유저 정보 넘겨주기 (0) | 2025.01.17 |
[Spring-AOP]특정 api 로깅하기 - requestBody를 어떻게꺼내?? (0) | 2025.01.03 |