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は、我々はそれらすべてを設定への任意の簡単な方法があり、あまりにも多くの注釈を持っ

@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

関連する問題