package org.example.expert.config;
import lombok.RequiredArgsConstructor;
import org.example.expert.domain.user.enums.UserRole;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity //웹 보안 지원을 활성화하고 Spring MVC 통합을 제공한다.
@EnableMethodSecurity(securedEnabled = true) //@Secured, @PreAuthorize, @PostAuthorize 와 같은 메서드 레벨 보안 애노테이션을 활성화
public class SecurityConfig {
private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Bean
public PasswordEncoder passwordEncoder() { //스프링 시큐리티는 BCryptPasswordEncoder를 제공해준다. @Bean으로 등록해 사용한다.
return new BCryptPasswordEncoder();
}
// @Bean
// public WebSecurityCustomizer webSecurityCustomizer() { //h2 웹 콘솔을 시큐리티가 막는 걸 무시하는 코드
// return (web -> web.ignoring()
// .requestMatchers(new AntPathRequestMatcher("/h2-console/**"))
// );
// }
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.addFilterBefore(jwtAuthenticationFilter, SecurityContextHolderAwareRequestFilter.class)
.formLogin(AbstractHttpConfigurer::disable)//SSR이 아니기 때문에 폼 기반 로그인 기능이 필요하지 않으므로 비활성화한다. UsernamePasswordAuthenticationFilter, DefaultLoginPageGeneratingFilter 비활성화
.anonymous(AbstractHttpConfigurer::disable)//익명 사용자 권한은 필요 없다.(인증은 JWT를 통해 이루어진다.) AnonymousAuthenticationFilter 비활성화
.httpBasic(AbstractHttpConfigurer::disable)//커스텀 FIlter를 사용하므로 비활성화 한다. BasicAuthenticationFilter 비활성화
.logout(AbstractHttpConfigurer::disable)//로그아웃은 세션 정보를 지우는 요청이다. 세션이 아니므로 비활성화 한다. LogoutFilter 비활성화
.rememberMe(AbstractHttpConfigurer::disable)//StateLess이기 때문에 Remember를 할 수가 없다. RememberMeAuthenticationFilter 비활성화
.authorizeHttpRequests(auth -> auth
.requestMatchers(request -> request.getRequestURI().startsWith("/auth")).permitAll()
.requestMatchers("/test").hasAuthority(UserRole.Authority.ADMIN)
.requestMatchers("/open").permitAll()
.requestMatchers("/h2-console/**").permitAll()
.anyRequest().authenticated() //SecurityContext에 AbstractAuthenticationToken이 set이 되어 있다면 통과를 시키겠단 의미이다.
)
.build();
}
}
스프링시큐리티 사용하면서 h2 웹 콘솔 허용하려고 할때
securityFilterChain에 써넣은 코드(아래에 적은 코드)로는 허용이 안되는 이유 질문하기.
.requestMatchers("/h2-console/**").permitAll()
h2-console 로 작성하면 아예 첫화면부터 403뜸.
h2-console/** 하면 첫화면은 잘 뜨나 connect 하면

이렇게 나옴.
'오류, 기능, 문제해결(JAVA)' 카테고리의 다른 글
| 프로그래머스 명예의 전당(1), PriorityQueue (0) | 2025.02.07 |
|---|---|
| 스프링 test 코드 진행중 classNotFoundException 터짐 (1) | 2025.02.05 |
| 프로그래머스 3진법 뒤집기 / Integer.parseInt(String s, int radix) (0) | 2025.01.16 |
| Class, System, Math, Random 클래스 (0) | 2025.01.15 |
| 키오스크 과제 트러블슈팅 (0) | 2025.01.13 |