0

내 REST API 엔드 포인트에 대한 권한 부여를 처리하기 위해 스프링 보안과 함께 JWT를 사용하고 있습니다. 다음 예에서 엔드 포인트는 사용자에 대한 정보를 제공합니다. ADMIN 사용자 만 모든 사용자의 세부 정보를 가져오고 다른 모든 사용자는 자신의 계정 세부 정보 만 받아야한다고 가정 해 보겠습니다. 누구나 주석 또는 어쩌면 AOP를 사용하여 다음 코드와 동등한 것을 구현하는 선언적 방법을 생각해 낼 수 있습니까?JWT 요청 인수로부터 봄 보안 사용자 권한 부여

@RequestMapping(value = "user/{userId}", method = RequestMethod.GET) 
@PreAuthorize("hasAnyRole('USER', 'ADMIN')") 
public UserDetailsDto getUserDetails(
     @AuthenticationPrincipal JwtUser user, 
     @PathVariable String userId) { 
    if (!user.getId().equals(userId) && user.getRole != Role.ADMIN) 
     throw new BadCredentialsException("Jwt token id and requested ids do not match"); 
    //handle the request 
} 
+0

나는 스프링 사용자가 아니며 단지 'spring-aop' 태그 때문에이 질문을 발견했다. 어쩌면 어리석은 질문에 대해 용서해주십시오.하지만 관리자 만이 방법으로 허용하고 싶다면 사전 인증 매핑을 @PreAuthorize ("hasAnyRole ('ADMIN')")'로 변경하면 어떨까요? 내가 올바르게 이해했다면, 현재 모든 사용자를 허용 한 다음 코드에서 비 관리자를 수동으로 제외합니다. 내가 오해 한 경우에도 AOP 솔루션 (내 전문 지식)을 제안 할 수는 있지만 우선 이것을 분명히하고 싶습니다. – kriegaex

+0

사용자이지만 사용자 계정에 매핑되지 않은 ID를 요청하는 사용자는 제외하므로 다른 사용자는 다른 모든 사용자의 데이터를 가져올 수 있으며 일반 사용자는 자신의 데이터 만 가져올 수 있습니다. 난 그냥 같은 방법을 재사용하고, 그것을 외부 구성 싶어요. –

+0

이제 귀하의 의도를 잘 이해합니다. 감사합니다. AOP 답변을 제시하기 전에 한 가지 더 : 사용자 ID를 제공하는 모든 방법을 보여주는 [MCVE] (http://stackoverflow.com/help/mcve)를 제공해 주시겠습니까? 스 니펫에서 현재 사용자 메소드 매개 변수 # 1, 세부 정보를 가져 오는 ID는 # 2입니다. '@ RequestBody' 주석을 언급하고 있었지만 어떻게 수행되는지 보여주지 않았습니다. (나는 Spring 사용자가 아니기 때문에 그것을 이해하기 위해 그것을 볼 필요가있다.) 그 동안 나는이 구체적인 예에 ​​대한 해결책을 제시 할 수있다. – kriegaex

답변

0

이 방법에서 가로 채기를 포인트 컷 참조로 정의 할 수 있습니다.

  1. 프로젝트에 aop을 포함하십시오. (apring - AOP 봄 부팅에 관련 항아리, 스프링 부팅 스타터 AOP를 포함 포함.)
  2. 응용 프로그램 구성에서 AOP를 사용
  3. (@EnableAspectJAutoProxy 주석으로 구성 클래스를 주석) 당신의 화면을 정의하고 전에 구성 Logic을 실행하기위한 조언. 예는 :

    @Aspect 
    @Component 
    public class Test { 
    
        @Before("execution(* com.package.name.*.getUser(..)) && args(user,dto)") 
        public void getAllAdvice(JwtUser user, GetUserRequestDto dto){ 
         System.out.println("Service method getter called"); 
         if (!user.getId().equals(dto.getUserId())) 
          throw new BadCredentialsException("Jwt token id and requested ids do not match"); 
         //handle the request 
        } 
    } 
    

지금, 당신의 결정은 측면의 일부가되어야하고 비즈니스 로직 컨트롤러가됩니다.

희망이 도움이됩니다!

관련 문제