私は、ユーザーが特定のリソースにしかアクセスできないSpring Webサービスを持っています。どのユーザーもリソース情報を取得するリクエストを行うことができますが、そのリソースにアクセスできない場合はAuthorization例外をスローする必要があります。 APIは次のとおりです。春のセキュリティ認証
上記のAPIは、ユーザーに特定のリソースに関するすべての情報を提供します。
現在、私はWebSecurityConfigurerAdapter
を使用して認証しています。認可を追加するには、認可された権限をAuthenticationオブジェクトの一部として設定できることがわかりました。その際、私は@PreAuthorize("hasRole('ROLE_USER')")
のようなものを使用して承認を行うことができます。
ただし、前述のAPIの場合、次の理由により、前述の承認方法が適切かどうかはわかりません。
- ユーザーが特定の
resourceId
にアクセスする権限を持っているかどうかに基づいて認証しています。これはまさに役割ではありません。 Privilegeにもっと似ています。このユースケースにはhasRole()
を使用することはできますか? hasRole()
注釈を使用した場合、@PreAuthorize("hasRole('ACCESS_RESOURCEID12346')")
のようなものを実行する必要があります。RESOURCEID12346
はresourceId
です。ただし、APIコントローラに入ってからはresourceId
にしかアクセスできません。では、その値を認可アノテーションに使用するにはどうすればよいですか?
指定された方法が問題を解決する最善の方法でない場合は、最良のアプローチとなる入力/フィードバックに感謝します。私はコントローラでこのチェックをしないでください。私は@PreAuthorizeの仕組みと同様に、Spring Securityを通じてこれをやろうとしています。私は、resourceIdへのアクセスは認可要件であり、ユーザーがそのリソースにアクセスできない場合、APIコントローラに入るべきではないと考えています。
あなたはユーザー情報を持っていますので、dbにUserResouceテーブルを用意し、getの関係をチェックします。 – ChiefTwoPencils
1.これは認証と承認を組み合わせないでしょうか?設計上の私の理解から、認証と認可を分けた方が良いです。 2.確認する必要があるリソースへのアクセス権を取得するにはどうすればよいですか?それは、APIパスのほんの一部です。 – AndroidDev93
それをどのように組み合わせるのか分かりません。あなたはROLE_USERの権利を事前認証する権限を持っていますか?したがって、あなたはすでに認証されており、パスとIDを持っています。だから、前提をすると、あなたは 'getResourceByUserAndResourceId(...)'を実行することができます。ここで、クエリは上記のテーブルを使用します。 – ChiefTwoPencils