문제 상황
위는 이미 해결한 PR인데, hasAnyRole을 사용하면 권한 체크가 안 되고, hasAnyAuthority를 사용해야 권한 체크가 잘 동작하는 일이 발생했다.
문제 원인
Spring Security 문서 26. Expression-Based Access Control (spring.io) << 여기를 들어가서 hasRole과 hasAnyAuthority 함수 동작의 차이를 찾아보았다.
간단히 요약하면, 현재 principal에 명시된 roles 중에서
hasRole([role])
지정된 역할이 현재 사용자에게 있는 경우 true를 반환한다. 기본적으로 제공된 역할이 'ROLE_'로 시작하지 않으면, 'ROLE_'이 자동으로 추가된다.
hasAuthority([authority])
지정된 권한이 현재 사용자에게 있는 경우 true를 반환한다.
하지만 UserRoleEnum 에서는 ROLE_을 붙이고 있지 않고, 이를 UserDetailsImpl.getAuthorities()에서 SimpleGrantedAuthority로 만들었기 때문에,
hasAnyRole("MASTER")의 경우 "ROLE_MASTER"로 찾게 되어 권한 체크가 안 되었다.
이 때문에 hasAnyAuthority를 사용해야 했다.
문제 해결
SimpleGrantedAuthority에서 role의 값을 ROLE_로 했다면 hasRole을, 붙이지 않았다면 hasAuthority를 사용하자.
Role과 Authority의 개념적 차이?
권한(authority):
- 권한은 사용자에게 부여된 세부적인 권한이나 특권을 나타낸다.
- 일반적으로 애플리케이션 내 특정 메서드나 리소스에 대한 액세스를 제어하는 데 사용된다.
역할(roles)
- 역할은 권한의 모음 또는 그룹을 나타냅다. 일반적으로 시스템 내에서 사용자의 위치나 책임을 설명하는 더 높은 수준의 개념이다.
- 역할은 종종 사용자에게 할당할 수 있는 Authority 그룹을 정의하는 데 사용된다. 예를 들어, ROLE_ADMIN 역할은 READ_PRIVILEGES, WRITE_PRIVILEGES, DELETE_PRIVILEGES와 같은 권한을 포함할 수 있다.
'Development > Diary' 카테고리의 다른 글
[Diary][Spring Security] UserDetails를 어떻게 캐싱할까? (0) | 2024.09.01 |
---|---|
[Diary] Spring ORM에서는 N + 1을 항상 신경쓰자. (0) | 2024.08.30 |
[Diary][Spring] 식별,비식별 관계? 관계의 방향? 외래 키의 주인? (1) | 2024.08.27 |
[Diary] @SpringBootApplication의 @ComponentScan 범위 (0) | 2024.08.26 |
[Diary][Spring] Spring Cloud Gateway와 FeignClient를 같이 사용하면 발생할 수 있는 문제 (0) | 2024.08.25 |