import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public BCryptPasswordEncoder encoderPwd() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.csrf().disable();
http.authorizeHttpRequests()
.requestMatchers("/user/**").authenticated() //인증만 되면 들어갈 수 있는 주소
.requestMatchers("/manager").hasAnyRole("ROLE_ADMIN", "ROLE_MANAGER")
.requestMatchers("/admin").hasRole("ROLE_ADMIN")
.anyRequest().permitAll() //
.and() //HttpSecurity
.formLogin() //FormLoginConfigurer <HttpSecurity>
.loginPage("/loginForm")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/");
return http.build();
}
}
이렇게 설정하고 해당 역할을 가진 사용자로 /admin 과 /manager 로 접근하려고 하는데, 403 에러가 발생하였다.
.requestMatchers("/manager").hasAnyRole("ROLE_ADMIN", "ROLE_MANAGER")
이곳이 문제였는데, SpringSecurity가 hasRole
에는 "ROLE_"이라는 prefix를 자동으로 붙여주기 때문이다.
반면 hasRole
대신 hasAuthority
를 사용하면 prefix를 붙여주지 않는다.
나는 아래와 같이 해결했다.
.requestMatchers("/manager").hasAnyRole("ADMIN", "MANAGER")