Spring/Spring Security

[Spring Security] ROLE VS AUTHORITY

제우제우 2024. 9. 2. 22:23

스프링 시큐리티에서 역할과 권한 

두 개념은 유사하지만 서로 다른 목적과 용도로 사용된다. 

 

역할 (Role)

  • 역할은 사용자가 수행할 수 있는 기능이나 책임을 그룹화하는 상위 개념 보통 여러 권한을 포함하는 큰 단위
  • 예) "ADMIN", "USER", "MANAGER"

권한 (Authority)

  • 특정 작업이나 자원에 대한 접근 권한을 정의하는 더 세분화된 개념, 권한은 구체적이며, 특정 작업이나 리소스에 대한 허가를 나타낸다. 
  • 예) "READ_PRIVILEGE", "WRITE_PRIVILEGE", "DELETE_PRIVILEGE" / 데이터 읽기 권한 

스프링 시큐리티에서 역할과 권한 설정하기

 

UserPrincipal: UserDetailsService 반환 객체 (UserDetails 구현체) 

https://20240228.tistory.com/167

 

[Spring Security] UserDetailsService

로그인 ~ 세션 생성 회원가입을 하고 유저의 정보를 DB에 저장하고 스프링 시큐리티를 통해 로그인을 했을 때어떤 방식으로 DB에서 유저 정보를 조회하고 활용할까?  1. 로그인 요청사용자가 로

20240228.tistory.com

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')")
                                )