프로그래밍/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를 통해 확인할 권한을 인자로 넘겨준다.