스프링 시큐리티에서 역할과 권한
두 개념은 유사하지만 서로 다른 목적과 용도로 사용된다.
역할 (Role)
- 역할은 사용자가 수행할 수 있는 기능이나 책임을 그룹화하는 상위 개념 보통 여러 권한을 포함하는 큰 단위
- 예) "ADMIN", "USER", "MANAGER"
권한 (Authority)
- 특정 작업이나 자원에 대한 접근 권한을 정의하는 더 세분화된 개념, 권한은 구체적이며, 특정 작업이나 리소스에 대한 허가를 나타낸다.
- 예) "READ_PRIVILEGE", "WRITE_PRIVILEGE", "DELETE_PRIVILEGE" / 데이터 읽기 권한
스프링 시큐리티에서 역할과 권한 설정하기
UserPrincipal: UserDetailsService 반환 객체 (UserDetails 구현체)
https://20240228.tistory.com/167
public class UserPrincipal extends User {
private final Long userId;
public UserPrincipal(com.jeulog.domain.User user){
super(user.getEmail(), user.getPassword(), List.of(
new SimpleGrantedAuthority("ROLE_ADMIN"), // ROLE O = 역할
new SimpleGrantedAuthority("WRITE") // ROLE X = WRITE
));
userId = user.getId();
}
public Long getUserId() {
return userId;
}
}
역할
ROLE_ 접두사를 붙여서 정의
ROLE_ADMIN, ROLE_USER 와 같이 사용
권한
ROLE_ 접두사가 없으면 권한으로 정의
WRITE, READ 와 같이 사용
SecurityFilterChain 역할, 권한 적용
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
return http
.authorizeHttpRequests(
authorize -> authorize
.requestMatchers("/auth/login").permitAll()
.requestMatchers("/auth/signup").permitAll()
.requestMatchers("/user").hasAnyRole("USER", "ADMIN")
.requestMatchers("/admin").access(
new WebExpressionAuthorizationManager(
"hasRole('ADMIN') AND hasAuthority('WRITE')")
)
.anyRequest().authenticated())
.csrf(AbstractHttpConfigurer::disable)
.formLogin(login -> login
.loginPage("/auth/login")
.loginProcessingUrl("/auth/login")
.usernameParameter("username")
.passwordParameter("password")
.defaultSuccessUrl("/")
)
.rememberMe(rm -> rm
.rememberMeParameter("remember")
.alwaysRemember(false)
.tokenValiditySeconds(2592000))
.build();
}
ADMIN 역할이 있는 사용자만 접근 가능
.requestMatchers("/admin").hasRole("ADMIN")
ADMIN, USER 역할 둘 중 하나만 있어도 접근 가능
.requestMatchers("/user").hasAnyRole("ADMIN", "USER")
권한 또한 hasAuthority(), hasAnyAuthority() 지원
역할 + 권한 같이 사용 → access() 메서드 사용
.requestMatchers("/admin").access(
new WebExpressionAuthorizationManager(
"hasRole('ADMIN') AND hasAuthority('WRITE')")
)
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security] 로그인 사용자 정보 가져오기 (0) | 2024.09.03 |
---|---|
[Spring Security] 핸들러(예외) 처리 (0) | 2024.09.02 |
[Spring Security] UserDetailsService (0) | 2024.09.02 |
[Spring Security] Remember Me (0) | 2024.09.02 |
[Spring Security] Spring Session JDBC (2) | 2024.09.02 |