ユーザーが投稿を読み書きできる、かなり単純な架空のアプリケーションを考えてみましょう。
記事を読み書きできるユーザーもいれば、読むことしかできないユーザーもいます。 Spring Security(3.2.1)では、2つの役割を持つことでこれをモデル化しました。
Springセキュリティでこれを実装することはかなり簡単です...
次に、サードパーティのアプリが Spring Security OAuth(version 2.0.0.M3 ATM))を使用してOAuth2プロバイダーを実装することにより、ユーザーに代わって投稿を読み書きできるようにします 。
承認ステップ中に、アプリはユーザーに代わって投稿の読み取りや書き込みの権利を許可するかどうかをユーザーに尋ねます。ここのユーザーは、ここでは(ロールではなく)スコープを許可しています。
次に、OAuth2コンシューマーがmy REST APIを呼び出すと、Spring Sec OAuthがトークンを承認し、すべてのロールとスコープのみを持つユーザーを含む認証を作成します。付与されます。
問題(および質問)は、APIが通常認証されたユーザーによって呼び出されるか(ロールを確認するだけ)、またはOAuth2を介して呼び出されるか(ロール+スコープを確認)に応じて、異なるセキュリティロジックを記述する必要があることです。
Spring Security OAuth2のロールとスコープの概念を「マージ」して、承認ステップ中にユーザーがロールのサブセットをアプリに付与することは可能ですか(そしてOAuth2認証は許可された機関でのみこれらを報告しますか?)そうすれば、サードパーティアプリがAPI呼び出しを行うときに、認証の役割が付与されますか?これにより、OAuth2固有のセキュリティロジックを記述する必要がなくなります。
スコープ(およびロール)は任意の文字列なので、同じにしたい場合でも問題ありません。アクセスルールの宣言を同一にするために、検出されたExpressionHandler
のタイプに応じて、同じ値を持つ権限またはスコープをテストするAuthentication
を作成できます。
コメントを読んだ後、別のアプローチが提案されます:カスタムTokenStore
またはResourceServerTokenServices
を追加します。これらは簡単にアクセスできる拡張ポイントであり、OAuth2Authentication
を変更して、付与された権限をスコープと同じにすることができます。
ただし、私の好みは、許可されたスコープをOAuth2RequestFactory
を使用して制御し、トークン付与の時点でそれらをユーザーの権限と一致する値に制限することです。
独自のAccessTokenConverter(主にJWT用)を構成し、JWTアクセストークンから必要なクレームを抽出して、Authorityオブジェクトを生成できます。 AccessTokenConverterを返すBeanファクトリを定義するだけです