リソース所有者の資格情報許可タイプを使用しています ( oauth2:password
inを使用していますsecurity-config.xml
。このシナリオを実行して、私の苦境を説明しましょう。
- ボブは権限を持って作成されました
ROLE_USER
- Bob が oauth2 で保護されたリソースにアクセスしようとする
- Bob は公式のモバイル アプリを使用してアクセスしているため、クライアントの資格情報は正しいです。
- Bob のアクセス トークンが作成され、 に保存され、彼の、、および
TokenStore
にキーが付けられます。( DefaultAuthenticationKeyGenerator.javaを参照)username
client_id
scope
- Bob の電話は、このアクセス トークンを使用して保護されたサービスを呼び出そうとしますが、それらのサービスにはユーザーが の を持っている必要があり
authority
ますROLE_MOBILE_USER
。 - Bob はデータベースの所有者に連絡
ROLE_MOBLE_USER
し、データベースに自分のユーザーを追加しました。 - Bob は別のアクセス トークンを取得しようとしますが、
DefaultTokenServices
動作していない同じアクセス トークンが返されます。 - 彼の新しいアクセス トークンを利用する唯一の方法
authority
は、古いアクセス トークンの有効期限が切れるまで待って、正しいauthority
.
これに対処する方法はいくつかあります。
ROLE_MOBILE_USER
たとえば、 Bob の権限に追加する管理アプリは、データベース内のすべてのアクセス トークンと承認をクリアできます。このようにしDefaultTokenServices
て、新しい OAuth2Authentication としてシリアル化された正しい権限を持つ新しい権限が作成されます。ただし、この時点では (少なくともまだ) 管理 Web アプリケーションを OAuth に関与させたくない場合があります。可能であれば、管理アプリの問題をできるだけ簡潔にしたいと考えています。現在、oauth への依存関係はありません。
DELETE
メソッドをエンドポイントに公開し、保存されたトークンが古くなっている/oauth/access_token
場合に備えて、そのアクセス トークンを削除して再要求するようモバイル アプリに指示することができます。authorities
ただし、これは回避策のように感じます。
最後にauthorities
、自分で定義したをシリアル化できAuthenticationKeyGenerator
ます。基本的に、認証のusername
、client_id
、scope
、およびauthorities
を使用し、それらに対して同じダイジェスト アルゴリズムを実行します。このようにして、Bob がログインしようとすると、同じアクセス トークンを取得しますが、基礎となるトークン ストアは、(トークン グランター Bean の認証マネージャーからの) 別の認証を持っていることを認識し、そのデータベースを更新します。このソリューションで私が抱えている問題は、基盤となるトークン ストアの実装動作に単純に依存していることです (ただし、 と の両方InMemoryTokenStore
がJdbcTokenStore
このように動作します)。
より良い/よりクリーンなソリューションを考えられますか? 私はこれを考えすぎていますか?
前もって感謝します。