작성
·
874
0
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.csrf(CsrfConfigurer::disable);
http.authorizeHttpRequests(authorize -> authorize
// "/user/~" 이 주소로 들어오면 인증이 필요함 -> 인증만 되면 들어갈 수 있는 주소!
.requestMatchers("/user/**").authenticated()
// "/manager/~" 이 주소로 들어가기 위해서는 Admin과 Manager 권한이 있는 사람만 들어올 수 있음
.requestMatchers("/manager/**").hasAnyRole(Role.ADMIN.name(), Role.MANAGER.name())
// "/admin/**" 이 주소로 들어가기 위해서는 Admin 권한이 있는 사람만 들어올 수 있음
.requestMatchers("/admin/**").hasAnyRole(Role.ADMIN.name())
// 설정한 주소가 아니면 누구나 들어갈 수 있음
.anyRequest().permitAll()
);
enum을 사용하여 Spring Security를 다음과 같이 설정했습니다.
public enum Role {
USER, MANAGER, ADMIN
}
enum은 다음과 같이 작성했습니다.
DB는 다음과 같습니다.
문제가 없는 것 같은데.. /admin 또는 /manager로 들어갈 시에 403에러가 뜹니다. 시큐리티 설정에서 문자열로 바꾸거나 ROLE_ 붙여도 안되고... 현재 쓰고있는 버전은 스프링 3.X버전, 시큐리티 6.X버전입니다.
에러가 나는 이유가 무엇일까요?
답변 2
0
-2
안녕하세요, 인프런 AI 인턴입니다.
ymg12347님의 스프링 시큐리티 설정과 관련된 문제를 확인해보겠습니다. 스프링 시큐리티 설정 시 권한 부여 관련하여 문자열에 “ROLE” 접두어를 붙여야 할 수 있습니다. 이는 스프링 시큐리티 내부에서 사용하는 기본 포맷이기 때문에, 해당 접두어 없이 설정 시 권한을 찾을 수 없어 403 에러가 발생할 수 있습니다. 스프링 시큐리티 6.X 버전을 사용 중이라면 hasAnyRole 메서드에 전달하는 역할 이름에 “ROLE” 접두어를 포함시켜야 할 수 있습니다. 예를 들어,
.requestMatchers("/manager/**").hasAnyRole("ROLE_ADMIN", "ROLE_MANAGER")
.requestMatchers("/admin/**").hasAnyRole("ROLE_ADMIN")
와 같이 설정을 변경해야 할 수 있습니다.
스프링 부트 3.X와 스프링 시큐리티 6.X 버전에서 “ROLE_” 접두어를 자동으로 추가하지 않도록 변경되었을 가능성을 고려해야 합니다. 자세한 내용은 스프링 시큐리티 참조 문서(https://docs.spring.io/spring-security/reference/6.1.5/security-core/index.html)에서 확인하실 수 있습니다.
문제가 계속된다면, 자세한 로그를 통해 추가적인 문제가 없는지 확인해보시기 바랍니다.