8

Spring セキュリティを使用するサイトがあり、ユーザー (ユーザー名とパスワード) と標準フォーム認証があります。OAuth2 セキュア REST API で使用するために、ユーザーが自分のアカウントにリンクされたクライアント ID とクライアント シークレットを生成できるようにします。

ユーザー名とパスワードではなく、API に個別のクライアント ID とクライアント シークレットを使用するため、ユーザーは API 資格情報を壊したり、特定のスコープを設定したり、API アクセスを無効にしたりせずにパスワードなどを変更できます。

spring-security-oauth2 (プロバイダー) を使用して残りの API を保護し、クライアント資格情報フローを許可しました。クライアントIDとシークレットがチェックされるように、APIのクライアント認証をセットアップしました。

別のアプリケーションから、クライアント ID とクライアント シークレットを使用してアクセス トークンを取得し、API で使用を開始します。ほとんどの場合、私は単純な @PreAuthorize 式を通常はクライアントの役割とスコープに基づいて使用していますが、これらは正しく機能しているようです。

上記はすべて正常に動作するようです

ただし...現在、いくつかの API エンドポイントがありますが、基になるユーザー (この場合はクライアント ID とシークレットを生成したユーザー) の詳細に基づいて、より複雑なルールを実装する必要があります。

簡単な例として、ユーザーがさまざまな特定のタイプの新しい「メッセージ」を投稿できるようにするエンドポイントがあるメッセージング アプリケーションを考えてみましょう。各ユーザーと各タイプの許可された受信者のテーブルがあり、投稿されたメッセージの受信者がそのタイプの許可された受信者と一致することを確認したいと考えています。(ユーザーが許可した受信者のデータは通常、大きくなく、めったに変更されないため、アクセス トークンを生成するときにそのコピーを保存できます)

これらのエンドポイントでプリンシパルを取得すると、次を含む OAuth2Authentication のインスタンスであることがわかります。

  • userAuthentication - null - これは、クライアント資格情報フローに期待できるようです。
  • clientAuthentication が入力され、authorizationParameters に権限付与タイプと client_id が含まれる

clientAuthentication.authorizationParameters のクライアント ID を使用してユーザーと必要な詳細を検索できると思いますが、それは意味をなさないと思われる API 呼び出しごとにいくつかのクエリになります。

Spring OAuth2 ライブラリには、後で OAuth2Authentication (プリンシパル) オブジェクト (またはそれを拡張するもの) からそれらを取得できるように、いくつかの追加の詳細を追加できるアクセス トークンを付与するという素晴らしい場所/方法があると思います。

あるいは、そのような問題に対するより良いアプローチはありますか?

どうも!

4

3 に答える 3

6

クライアントの詳細で定義できるスコープを使用せず、ScopeVoter を使用して検証するのは、このトークンがこのリソースにアクセスするための適切なスコープを持っているかどうかです。

詳細については私のデモをチェックしてください

https://github.com/bassemZohdy/Spring_REST_OAuth_Demo

更新 1:「OAuth2 プリンシパルからカスタム データを取得する」という質問のパート 2 に返信しませんでした。OAuth トークンを使用してアクセスされる認証サーバーに残りのサービスを追加して、このトークン ユーザーに関する必要な情報を提供することができます。認可サーバーをリソースサーバーとして扱っている「OAuth2プリンシパル」を気にする必要はありません。

于 2013-04-28T14:27:45.020 に答える