[SpringSecurity] Role 설정 시 403에러

유알·2022년 12월 18일
1

[SpringSecurity]

목록 보기
2/15
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")
profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글