spring security를 공부하면서 사용자 접근 제어를 위해 authority와 role 두 가지 개념을 제공하는 것을 알았다. 두 개념이 어떻게 다른지에 대해서 정리해보았다.
spring security에서는 User를 이용해 authority와 role을 쉽게 설정할 수 있다.
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
UserDetails user1 = User.withUsername("john")
.password("{noop}12345")
.authorities("READ")
.build();
UserDetails user2 = User.withUsername("jane")
.password("{noop}12345")
.authorities("WRITE")
.build();
manager.createUser(user1);
manager.createUser(user2);
return manager;
}
위 코드는 "john"에게 "READ" 권한을 주고 "jane"에게는 "WRITE" 권한 준다.
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
UserDetails user1 = User.withUsername("john")
.password("{noop}12345")
// .authorities("ROLE_ADMIN")
.roles("ADMIN") // roles() 메서드를 이용할때는 ROLE prefix를 사용하지 말아야 함
.build();
UserDetails user2 = User.withUsername("jane")
.password("{noop}12345")
// .authorities("ROLE_MANAGER")
.roles("MANAGER")
.build();
manager.createUser(user1);
manager.createUser(user2);
return manager;
}
위의 예제는 roles()메서드를 이용해서 "john"과 "jane" 에게 각각 "ADMIN","MANAGER" 역할을 부여한다.
역할을 정의할 때 authorieis() 메서드를 이용할 수 있지만 "ROLE_" prefix를 붙여한다는 점을 유의해야 한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain httpSecurity(HttpSecurity http) {
http
.authorizeRequests()
.antMatchers("/admin/*").hasRole("ADMIN") // ROLE_ 접두사 자동 추가
.antMatchers("/auth/**").hasAnyRole("ADMIN", "USER") // 여러 역할 중 하나
.antMatchers("/data/**").hasAuthority("ROLE_ADMIN") // 전체 문자열 명시
.anyRequest().authenticated();
return http.build();
}
}
위 예제 코드는 endpoint 별로 role과 authority에 따라 접근 허용 여부를 설정하는 방법을 보여준다.
spring security에서는 권한과 역할을 SimpleGrantedAuthority를 통해 처리한다는 것을 알고, 요구사항에 따라 권한 및 역할을 잘 정의하고 유저마다 알맞은 메소드를 사용해야 한다.
DelegatingPasswordEncoder 란? (0) | 2025.04.30 |
---|---|
UserDetailsService와 UserDetailsManager (0) | 2025.04.27 |
Spring Security 인증 흐름 (0) | 2025.04.27 |
댓글 영역