UserDetails와 getAuthorities() 메서드
현재 인증된 사용자는 UserDetails에 들어있기 때문에, UserDetails의 getAuthorities() 메서드를 사용할 수 있습니다.
getAuthorities() 메서드는 Collection<? extends GrantedAuthority>를 반환하며, GrantedAuthority는 문자열(String) 타입과는 호환되지 않습니다.
문자열 비교의 문제점
원래는 다음과 같이 문자열로 권한을 비교하고 있습니다.
하지만 userDetails.getAuthorities() 메서드는 Collection<? extends GrantedAuthority>를 반환하며, contains 메서드는 문자열 객체와 비교하지 않고, GrantedAuthority 객체의 toString() 메서드를 사용하여 비교합니다.
이는 GrantedAuthority 객체의 toString() 메서드가 문자열 표현을 반환하기 때문에 가능합니다.
다음과 같은 접근 방식도 문자열로 권한을 비교하는 방법입니다.
이 접근 방법도 문자열 비교를 사용하지만, 다음과 같은 문제점이 있습니다.
- 대괄호와 구분자
- toString() 메서드는 권한 목록을 문자열로 변환할 때 대괄호([])와 구분자(쉼표 등)를 포함합니다.
- 따라서 권한 목록에 포함된 특정 권한만을 정확히 비교하는 것이 어려울 수 있습니다.
- 순서와 형식
- toString() 메서드는 권한의 순서나 형식에 따라 문자열 표현이 달라질 수 있으므로, 정확한 문자열 비교가 어려울 수 있습니다.
권한 객체 직접 비교
따라서 권한을 문자열로 직접 비교하는 것보다는, 권한 객체를 직접 비교하거나 스트림을 사용하여 권한을 정확히 확인하는 방법이 더 효과적입니다.
getAuthorities() 메서드는 Collection를 반환하기 때문에, GrantedAuthority 객체를 사용하여 권한을 정확히 비교하는 것이 바람직합니다.
- stream()
- Collection<GrantedAuthority>를 스트림으로 변환하여 권한을 순회합니다.
- map(GrantedAuthority::getAuthority)
- GrantedAuthority 객체에서 권한 문자열을 추출합니다.
- anyMatch("ROLE_MASTER"::equals)
- 권한 목록 중 하나라도 "ROLE_MASTER"와 일치하는지 확인합니다.
이 방법은 권한을 정확히 비교할 수 있게 해주며, 대괄호와 구분자 문제를 피할 수 있습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.08.31 - @MappedSuperclass 적용하기 (0) | 2024.08.31 |
---|---|
[Til, 일일 회고] 2024.08.30 - @MappedSuperclass란 무엇일까❓ (0) | 2024.08.30 |
[TIL, 일일 회고] 2024.08.28 - Git 브랜치 전환 시 파일이 계속 보이는 이유와 해결 방법 (0) | 2024.08.28 |
[TIL, 일일 회고] 2024.08.27 - Spring Security와 @AuthenticationPrincipal을 활용한 관리자 및 사 (0) | 2024.08.27 |
[TIL, 일일 회고] 2024.08.26 - @Pattern 사용 (0) | 2024.08.26 |