dto 어노테이션
•
dto에 불필요한 어노테이션과 꼭 필요한 어노테이션에 대해 고민하며 requestBody의 동작 원리까지 공부해볼 수 있었다. 결론은 아래와 같다.
responseDto → @builder, @getter
•
getter없고 builder만 넣었을 때
에러
•
getter가 꼭 필요함!
requestDto → @NoArgsConstructor, @Getter
•
noArgsConstructor 다들 필요하다는데,,,
•
실제로 필요한 dto도 있었고, 없어도 문제 없이 동작하는 dto도 있었다.
•
이에 대한 분석은 꼭 TODO로 남겨두자.
스프링 부트 3.0 이상 Spring Security 6 사용
•
SecurityFilterChain을 Bean으로 등록해서 사용하는 방식으로 바뀐 건 진즉 알고 있었는데, 특이하게,,, 람다를 사용하게 바꼈다,,, 흠… 일단 람다로 쓰니 전부 작동하고 공식문서에서도 람다를 사용하는 예시가 보이는데 좀 더 확인해봐야겠다. 일단 아래와 같이 설정하면 잘 동작하니 참고 정도는 하면 좋을 거 같다. Spring Security 6 설정에 대해
@RequiredArgsConstructor
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
private final CustomAccessDeniedHandler customAccessDeniedHandler;
private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint;
private final AuthenticationConfiguration authenticationConfiguration;
private final UserRepository userRepository;
private final JwtTokenProvider jwtTokenProvider;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(8);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // csrf 보안 토큰 사용 x
.httpBasic(httpBasic -> httpBasic.disable()) // 매 요청마다 id, pwd 보내는 방식 사용 x
.formLogin(formLogin -> formLogin.disable()) // formLogin 사용 x
.sessionManagement(sessionManagement -> sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션 사용 x
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(customAuthenticationEntryPoint))
.exceptionHandling(exceptionHandling -> exceptionHandling.accessDeniedHandler(customAccessDeniedHandler))
.addFilter(jwtAuthorizationFilter())
.addFilterBefore(jwtExceptionFilter(), JwtAuthorizationFilter.class)
.authorizeRequests(authorizeRequests -> authorizeRequests.expressionHandler(expressionHandler()))
.authorizeRequests(authorize -> authorize
.requestMatchers("/api/v1/auth/**").permitAll()
.anyRequest().hasRole("TEACHER")
);
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("http://localhost:3000");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
@Bean
public AuthenticationManager authenticationManager() throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Bean
public JwtAuthorizationFilter jwtAuthorizationFilter() throws Exception {
return new JwtAuthorizationFilter(authenticationManager(), userRepository, jwtTokenProvider);
}
@Bean
public JwtExceptionFilter jwtExceptionFilter() {
return new JwtExceptionFilter();
}
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_DIRECTOR > ROLE_TEACHER");
return roleHierarchy;
}
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler() {
DefaultWebSecurityExpressionHandler expressionHandler =
new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}
}
Java
복사
Intellij 한글 로그 깨짐 해결
•
한글 패치 깔아서 해결했음