쌓고 쌓다
컨트롤러에서 권한 체크하는 방법 본문
똑같은 요청이라도 특정 조건에서는 권한 체크를 확인하는 로직을 구현하고자 한다.
작성한 코드는 다음과 같다.
@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를 통해 확인할 권한을 인자로 넘겨준다.
'프로그래밍 > spring' 카테고리의 다른 글
JSON Array를 읽고 원하는 클래스로 변환하는 방법 (0) | 2024.03.15 |
---|---|
테스트 코드에 MultipartFile 사용하는 방법 (파일 테스트 코드) (0) | 2024.03.10 |
@Transactional 롤백 동작 정책 (예외가 발생했는데 롤백이 안될때) (0) | 2024.03.06 |
DTO와 Entity의 변환 Layer는 어디가 좋을까? (0) | 2024.02.29 |
@Authenticationprincipal와 영속성 컨텍스트 (0) | 2024.02.21 |
Comments