2016-12-25 30 views
1

私は、ユーザーが特定のリソースにしかアクセスできないSpring Webサービスを持っています。どのユーザーもリソース情報を取得するリクエストを行うことができますが、そのリソースにアクセスできない場合はAuthorization例外をスローする必要があります。 APIは次のとおりです。春のセキュリティ認証

上記のAPIは、ユーザーに特定のリソースに関するすべての情報を提供します。

現在、私はWebSecurityConfigurerAdapterを使用して認証しています。認可を追加するには、認可された権限をAuthenticationオブジェクトの一部として設定できることがわかりました。その際、私は@PreAuthorize("hasRole('ROLE_USER')")のようなものを使用して承認を行うことができます。

ただし、前述のAPIの場合、次の理由により、前述の承認方法が適切かどうかはわかりません。

  1. ユーザーが特定のresourceIdにアクセスする権限を持っているかどうかに基づいて認証しています。これはまさに役割ではありません。 Privilegeにもっと似ています。このユースケースにはhasRole()を使用することはできますか?
  2. hasRole()注釈を使用した場合、@PreAuthorize("hasRole('ACCESS_RESOURCEID12346')")のようなものを実行する必要があります。RESOURCEID12346resourceIdです。ただし、APIコントローラに入ってからはresourceIdにしかアクセスできません。では、その値を認可アノテーションに使用するにはどうすればよいですか?

指定された方法が問題を解決する最善の方法でない場合は、最良のアプローチとなる入力/フィードバックに感謝します。私はコントローラでこのチェックをしないでください。私は@PreAuthorizeの仕組みと同様に、Spring Securityを通じてこれをやろうとしています。私は、resourceIdへのアクセスは認可要件であり、ユーザーがそのリソースにアクセスできない場合、APIコントローラに入るべきではないと考えています。

+0

あなたはユーザー情報を持っていますので、dbにUserResouceテーブルを用意し、getの関係をチェックします。 – ChiefTwoPencils

+0

1.これは認証と承認を組み合わせないでしょうか?設計上の私の理解から、認証と認可を分けた方が良いです。 2.確認する必要があるリソースへのアクセス権を取得するにはどうすればよいですか?それは、APIパスのほんの一部です。 – AndroidDev93

+0

それをどのように組み合わせるのか分かりません。あなたはROLE_USERの権利を事前認証する権限を持っていますか?したがって、あなたはすでに認証されており、パスとIDを持っています。だから、前提をすると、あなたは 'getResourceByUserAndResourceId(...)'を実行することができます。ここで、クエリは上記のテーブルを使用します。 – ChiefTwoPencils

答えて

2

リソースIDにバインドされたロールを介してパーミッションを配布することは、潜在的なメンテナンスの悪夢のようです。コントローラへのアクセスを許可したくない場合は、おそらくaccessを使用することをお勧めします。

上記のリンクには、JavaおよびXMLベースの設定の両方の例があり、コントローラに入る前にパスへのアクセス方法を示しています。あなたはそれ{resourceId}から#resourceIdマッピングのようなURLの引数を参照してくださいあなたの設定では

boolean checkResourceAccess(Principal principal, int resourceId)

は、あなたが同様の参照方法を提供します。

Javaの設定例:あなたは、ユーザーのアクセスを決定するために必要なロジックを全て提供している方法では

http.authorizeRequests() 
    .antMatchers("/resources/{resourceId}") 
    .access("@yourBean.checkResourceAccess(principal,#resourceId)")... 

+0

このアプローチは、認証中にそのresourceIdのGrantedAuthorityを使用し、@PreAuthorize( "hasAuthority( 'ACCESS_#resourceId')")を使用するよりも優れていますか? – AndroidDev93

+1

「より良い」主観的だと思います。あなたは受け入れられた答え[ここ](http://stackoverflow.com/questions/19525380/difference-between-role-and-grantedauthority-in-spring-security)を読んだことがありますか? – ChiefTwoPencils

関連する問題