프로그래밍/spring
컨트롤러에서 권한 체크하는 방법
승민아
2024. 3. 7. 13:14
똑같은 요청이라도 특정 조건에서는 권한 체크를 확인하는 로직을 구현하고자 한다.
작성한 코드는 다음과 같다.
@GetMapping
public ResponseEntity<PageResponse<List<LocationResponse>>> getLocations(@RequestParam("latitude") Double latitude,
@RequestParam("longitude") Double longitude,
@Valid @ModelAttribute LocationConditionRequest conditionRequest) throws PermissionException {
Boolean approve = conditionRequest.getApprove();
if (!approve) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean containsAdmin = authorities.contains(new SimpleGrantedAuthority(Role.ADMIN.toString()));
if(!containsAdmin) {
throw new PermissionException(ErrorCode.FORBIDDEN_CLIENT);
}
}
핵심은 다음과 같다.
SecurityContextHolder.getContext().getAuthentication();
시큐리티 컨텍스트 홀더에서 Authentication을 꺼내어 권한을 확인하면 된다.
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
구현한 Principal 객체(UserDetail를 구현한 객체)의 getAuthorities() 메서드를 통해 권한들을 꺼내온다.
public class PrincipalDetails implements UserDetails {
private Member member;
public PrincipalDetails(Member member) {
this.member = member;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new SimpleGrantedAuthority(member.getRole().toString()));
return collection;
}
...
}
권한은 위와 같이 SimpleGrantedAuthority를 통해 권한을 넣어두었다.
boolean containsAdmin = authorities.contains(new SimpleGrantedAuthority(Role.ADMIN.toString()));
권한이 존재하는지는 authorities의 contains를 통해 확인할 권한을 인자로 넘겨준다.