본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 7. 게시글 등록 기능 - 인가 권한 설정

by Lpromotion 2024. 10. 7.

현재 사용자의 역할은 USER, ADMIN, GUEST로 구분된다. 게시글 관련 기획에서 “게시글 리스트 조회”는 모든 역할이 접근 가능하고, “게시글 등록”은 USER와 ADMIN 역할만 수행할 수 있도록 결정되었다. Sprnig Security 설정을 수정하여 인가 권한을 설정했다.

 

1. Security 설정 파일 수정

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    // ... (다른 필드 및 의존성 주입 생략)
    
    @Bean
    protected SecurityFilterChain securityFilterChain(final HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                // ... (다른 설정 생략)
                .authorizeHttpRequests(requestMatcherRegistry -> requestMatcherRegistry
                        // ... (다른 경로 설정 생략)
                        .requestMatchers("/api/v1/posts/register").hasAnyRole((ERole.USER.toString()), ERole.ADMIN.toString())
                        .anyRequest().authenticated())
                // ... (나머지 설정 생략)
                .getOrBuild();
    }
}
.requestMatchers("/api/v1/posts/register").hasAnyRole((ERole.USER.toString()),ERole.ADMIN.toString())

"/api/v1/posts/register" 경로에 대해 Spring Security의 `hasAnyRole()` 메서드를 사용하여 `ERole.USER.toString()`, `ERole.ADMIN.toString()` 을 파라미터로 전달해 USER와 ADMIN 역할을 가진 사용자에게 접근 권한을 부여했다.

Spring Security는 내부적으로 "ROLE_" 접두사를 추가하여 권한을 확인한다. (ERole 열거형 참고)

 

2. ERole 열거형

@RequiredArgsConstructor
public enum ERole {
    USER("USER", "ROLE_USER"),
    ADMIN("ADMIN", "ROLE_ADMIN"),
    GUEST("GUEST", "ROLE_GUEST");

    private final String name;
    private final String securityName;

    @Override
    public String toString() {
        return this.name;
    }

    public String toSecurityString() {
        return this.securityName;
    }

}

`toString()` 메서드는 일반적인 역할 이름을 반환하고, hasAnyRole() 메서드에서 사용된다.

`toSecurityString()` 메서드는 “ROLE_” 접두사가 포함된 보안 이름을 반환하고, 다른 설정에서 활용될 수 있다.

반응형

댓글