728x90

 

 

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"와 일치하는지 확인합니다.

 

이 방법은 권한을 정확히 비교할 수 있게 해주며, 대괄호와 구분자 문제를 피할 수 있습니다.