2016-08-05 2 views
0

예 :스프링 보안 RESTful 경로 기반 역할 제어

/user/{userId}/* # Only user with userId and admin can access 
/order/{orderId}/* # Only the order owner of orderId and admin can access 

현재 솔루션은 @Current 애노테이션 서버에 전달 token 관련되는 맞춤형 주입된다. @PathVariable("user-id") UserEntity user 우리는 그들 모두를 config (설정) 할 수있는 간단한 방법이 너무 많은 주석을 가지고

@PreAuthorize("#user.id == #u?.id") 
public UserDTO access(@P("user") @Current UserEntity requestUser, 
         @P("u") @PathVariable("user-id") UserEntity user) 

@PreAuthorize("#user.id == #uid && (#order == null || #order?.user?.id == #uid)") 
public Message access(@Current @P("user") UserEntity user, 
         @PathVariable("user-id") @P("uid") Long uid, 
         @PathVariable("order-id") @P("order") OrderEntity order) 

봄 - 데이터와 경로에서 받고 있습니다?

사용자 확인을 사용자 정의 할 수 없습니다 사용 .antMatchers("/user/[0-9]+/*").hasRole("ROLE_USER")

  1. 을 시도했다.
  2. AOP는 너무 복잡하여 URL을 기반으로 할 수 없습니다.

답변

1

리소스 보안을 위해 미세한 로직을 구현하려면 메서드 보안을 사용하는 것이 좋습니다. 내 생각에 URL 기반 인증은 간단한 사용 사례에만 효과적입니다. 권한 부여 논리는 여러 줄의 코드를 필요로하는 경우 나 또한 (대신 @PreAuthorize를 사용하는) 당신의 방법의 보안을 구현하는 사용자 정의 주석으로 AOP를 사용하는 것이 좋습니다 것입니다

... 당신이 주석 메소드 호출을 가로 챌 수있는 예를 들어

:

@Before("@annotation(your.annotations.AllowedToOwner) && @annotation(ann)") 
public void checkOwner(JoinPoint joinPoint, AllowedToOwner ann) throws Throwable { 

    // check owner, throws AccessDeniedException if check fails... 
} 
+0

아마도 이것은 수행 가능한 방법 일 수 있습니다. – wener

+0

@ 이것이 내 프로젝트에 일반적으로 적용되는 접근 방식입니다. 어쩌면 당신이 원하는 것을 성취 할 수있는 더 좋은 방법이있을 수 있지만,이 방법은 매우 읽기 쉽고 효과적입니다. – davioooh

관련 문제