目次
質問の内容
実用的なソリューションの更新の使用 (2024 年 1 月 25 日)
解決策
ブート 3.2.2 と spring-addons を使用します
示例控制器
示例测试
ホームページ Java AAD と AWS Cognito を使用してさまざまなエンドポイントの Spring Boot REST API を保護する

AAD と AWS Cognito を使用してさまざまなエンドポイントの Spring Boot REST API を保護する

Feb 22, 2024 pm 01:22 PM
overflow

php エディター Baicao は、AAD と AWS Cognito を使用して Spring Boot REST API を保護することに関する Java Q&A 記事を注意深く作成しました。この記事では、これら 2 つの認証サービスを活用してさまざまなエンドポイントを保護し、API の安全性を確保する方法を説明します。私たちのガイドに従って、Spring Boot プロジェクトに認証と認可を実装して、REST API をより強力で信頼性の高いものにする方法を学びましょう。

質問の内容

このトピックに関するリソースがどこにも見つからないため、誰かがここで私を助けてくれることを願っています。

Spring Boot Restapi があり、現在の構成には 2 つのルートがあります: 1. 非認証 2. aad/entra のベアラーを介して認証

私の構成方法は現在次のように設定されています:

リーリー

これは、aadresourceserverwebsecurityconfigureadapter を拡張するクラスでラップされています。

このように API を構成することで、次のようにルートを保護できます:

リーリー

新しいタイプのユーザーが認可エンドポイントを使用できるように API を拡張する必要があります。これらのユーザーは aws cognito によって管理されます。一部のパスを承認せず、一部のパスを aad 経由で保護し、一部のパスを aws cognito 経由で保護できるように websecurityconfigureadapter を設定するにはどうすればよいですか?

私が抱えている主な問題は、aadresourceserverwebsecurityconfigureadapter が Microsoft が提供するベアラーでのみ機能するように jwt 検証を構成していることです。

理想的には次のようなものが欲しいです:

リーリー

私が見つけたもう 1 つの問題は、aadresourceserverwebsecurityconfigureadapter が、jwtclaimnames の「roles」と「scp」のすべての可能なプレフィックスを「scope_」と「approle_」に自動的に設定することです。理想的には、aad と aws cognito で異なるものにして、「aad_scope_」、「aad_approle_」、「cognito_group_」という接頭辞を付けるようにしたいと思います。

スプリングブート用のマルチテナントjwt認証を実装する方法を説明する情報をいくつか見つけましたが、それらはすべてSQLデータベースを使用してパスワード/ユーザーベースの認証を実装するだけです。

aws cognito によって提供される jwt の検証を組み込むことができるように、基本的にすべての aad ロジックを再実装する必要がある方法はありますか、それともルーティングに基づいて決定を行う方法はありますか?

httpsecurityoauth2resourceserver() 関数を使用して jwt の使用を構成できることはすでに知っていますが、その機能を単一のテナントに実装する方法に関する情報しか見つかりませんでした。

この特定のケースまたは同様のケースをうまく実装した人、または私を正しい方向に導いてくれる人がいたら、非常に感謝します。 あるいは、私の考えが完全に間違っているかもしれないので、教えてください。

実用的なソリューションの更新の使用 (2024 年 1 月 25 日)

@ch4mp の回答のおかげで、成功しました。 >実用的な回答<

私の実装は非常に単純化され、次のようになります:

アプリケーション.yml

リーリー

セキュリティ構成

リーリー

私のコントローラーは次のようになります:

リーリー

Build.gradle

リーリー

これ Springの公式ランチャーではなく、OSS実装です: https://www.php.cn/link/49844ba129a1cbc3d964703fcdb756ba

他の問題が発生した場合は再度更新しますが、今のところは問題なく動作しています。

解決策

簡単なので、私のスターターを使用してここで解決策を公開します。

「公式」スプリング ブート ランチャーのみを使用して安全な構成を構築したい場合は、認証マネージャーごとに、iss 宣言を使用して独自の authenticationmanagerresolver<httpserletrequest> を提供する必要があります。各サーバーには、必要なオリジン クレームとプレフィックスを処理するための独自の認証コンバーターと独自のアクセス許可コンバーターがあります。例と実装のヒントについては、<a href="https://www.php.cn/link/49844ba129a1cbc3d964703fcdb756ba/tree/master/samples/tutorials" rel="nofollow noreferrer">私のチュートリアル</a> または <a href="https://www.php.cn/link/37841383bc8c327de7912cf44790f3fd" rel="nofollow noreferrer">公式ドキュメント</a>を参照してください。 <a href="https://www.php.cn/link/945a1b4276b1524763d2acc19dc8c475">この他の回答</a>も役立つかもしれません(権限マッピングの要件は完全に異なりますが、認証マネージャーのリゾルバーは似ています)。 </p> <h3 id="ブート-code-code-と-spring-addons-を使用します">ブート <code>3.2.2 と spring-addons を使用します リーリー リーリー

次の application.yaml を編集して、独自のパブリッシャーを配置します:

リーリー

上記の path の値は json パスです。 jsonpath.com などのツールを使用して、独自のトークン ペイロード (jwt.io などのツールを使用して抽出された) に対してパス式をテストできます。

はい、とても簡単です。いいえ、yaml プロパティや Java 設定を省略したわけではありません (信じられない場合は、新しいプロジェクトでテストしてください)。

示例控制器

@restcontroller
public class greetcontroller {

    @getmapping("/greet")
    @preauthorize("isauthenticated()")
    public string getgreet(authentication auth) {
        return "hello %s! you are granted with %s.".formatted(auth.getname(), auth.getauthorities());
    }

    @getmapping(value = "/strings")
    @preauthorize("hasanyauthority('aad_approle_admin', 'cognito_group_admin')")
    public list<string> getstrings() {
        return list.of("protected", "strings");
    }
}
ログイン後にコピー

示例测试

@webmvctest(controllers = greetcontroller.class)
@autoconfigureaddonswebmvcresourceserversecurity
@import(securityconf.class)
class greetcontrollertest {
    @autowired
    mockmvcsupport api;

    @test
    @withanonymoususer
    void givenuserisanonymous_whengetgreet_thenunauthorized() throws unsupportedencodingexception, exception {
        api.get("/greet").andexpect(status().isunauthorized());
    }

    @test
    @withjwt("aad_admin.json")
    void givenuserisaadadmin_whengetgreet_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/greet").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals(
            "hello aad-admin! you are granted with [aad_approle_msiam_access, aad_approle_admin, aad_scope_openid, aad_scope_profile, aad_scope_machin:truc].",
            actual);
    }

    @test
    @withjwt("cognito_admin.json")
    void givenuseriscognitoadmin_whengetgreet_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/greet").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals("hello amazon-cognito-admin! you are granted with [cognito_group_admin, cognito_group_machin:truc].", actual);
    }

    @test
    @withjwt("aad_machin-truc.json")
    void givenuserisaadmachintruc_whengetgreet_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/greet").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals("hello aad-user! you are granted with [aad_approle_msiam_access, aad_scope_openid, aad_scope_profile, aad_scope_machin:truc].", actual);
    }

    @test
    @withjwt("cognito_machin-truc.json")
    void givenuseriscognitomachintruc_whengetgreet_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/greet").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals("hello amazon-cognito-user! you are granted with [cognito_group_machin:truc].", actual);
    }

    @test
    @withanonymoususer
    void givenuserisanonymous_whengetstrings_thenunauthorized() throws unsupportedencodingexception, exception {
        api.get("/strings").andexpect(status().isunauthorized());
    }

    @test
    @withjwt("aad_admin.json")
    void givenuserisaadadmin_whengetstrings_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/strings").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals("[\"protected\",\"strings\"]", actual);
    }

    @test
    @withjwt("cognito_admin.json")
    void givenuseriscognitoadmin_whengetstrings_thenok() throws unsupportedencodingexception, exception {
        final var actual = api.get("/strings").andexpect(status().isok()).andreturn().getresponse().getcontentasstring();
        assertequals("[\"protected\",\"strings\"]", actual);
    }

    @test
    @withjwt("aad_machin-truc.json")
    void givenuserisaadmachintruc_whengetstrings_thenforbidden() throws unsupportedencodingexception, exception {
        api.get("/strings").andexpect(status().isforbidden());
    }

    @test
    @withjwt("cognito_machin-truc.json")
    void givenuseriscognitomachintruc_whengetstrings_thenforbidden() throws unsupportedencodingexception, exception {
        api.get("/strings").andexpect(status().isforbidden());
    }

}
ログイン後にコピー

使用此测试资源:

  • aad_admin.json
{
    "sub": "aad-admin",
    "iss": "https://sts.windows.net/0a962d63-6b23-4416-81a6-29f88c553998/",
    "approles": [
        {
          "allowedmembertypes": [
            "user"
          ],
          "description": "msiam_access",
          "displayname": "msiam_access",
          "id": "ef7437e6-4f94-4a0a-a110-a439eb2aa8f7",
          "isenabled": true,
          "origin": "application",
          "value": null
        },
        {
          "allowedmembertypes": [
            "user"
          ],
          "description": "administrators only",
          "displayname": "admin",
          "id": "4f8f8640-f081-492d-97a0-caf24e9bc134",
          "isenabled": true,
          "origin": "serviceprincipal",
          "value": "administrator"
        }
    ],
    "scope": "openid profile machin:truc"
}
ログイン後にコピー
  • aad_machin-truc.json
{
    "sub": "aad-user",
    "iss": "https://sts.windows.net/0a962d63-6b23-4416-81a6-29f88c553998/",
    "approles": [
        {
          "allowedmembertypes": [
            "user"
          ],
          "description": "msiam_access",
          "displayname": "msiam_access",
          "id": "ef7437e6-4f94-4a0a-a110-a439eb2aa8f7",
          "isenabled": true,
          "origin": "application",
          "value": null
        }
    ],
    "scope": "openid profile machin:truc"
}
ログイン後にコピー
  • cognito_admin.json
{
    "sub": "amazon-cognito-admin",
    "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_rzhmglwjl",
    "cognito:groups": ["admin", "machin:truc"],
    "scope": "openid profile cog:scope"
}
ログイン後にコピー
  • cognito_machin-truc.json
{
    "sub": "amazon-cognito-user",
    "iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_RzhmgLwjl",
    "cognito:groups": ["machin:truc"],
    "scope": "openid profile cog:scope"
}
ログイン後にコピー

以上がAAD と AWS Cognito を使用してさまざまなエンドポイントの Spring Boot REST API を保護するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 Jan 15, 2025 pm 08:11 PM

2009 年の誕生以来、ビットコインは暗号通貨の世界のリーダーとなり、その価格は大きな変動を経験しました。包括的な歴史的概要を提供するために、この記事では 2009 年から 2025 年までのビットコイン価格データをまとめ、主要な市場イベント、市場センチメントの変化、価格変動に影響を与える重要な要因を取り上げます。

Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 May 06, 2024 pm 01:20 PM

1. まず、Windows 11の下部にあるタスクバーの空白部分を右クリックし、[タスクバーの設定]を選択します。 2. タスクバー設定の右側にある [taskbarcorneroverflow] を見つけます。 3. 次に、その上にある [時計] または [時計] を見つけて選択し、オンにします。方法 2: 1. キーボード ショートカット [win+r] を押して [ファイル名を指定して実行] を呼び出し、[regedit] と入力して Enter キーを押して確定します。 2. レジストリエディタを開き、その中にある[HKEY_CURRENT_USERControlPanel]を見つけて削除します。 3. 削除後、コンピュータを再起動すると、システムに戻ると、設定を求めるプロンプトが表示されます。

Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Apr 28, 2024 pm 02:12 PM

回答: Java 関数型プログラミングの質問には、次のコミュニティ フォーラムおよびディスカッション グループが利用できます。 StackOverflow: Java 関数型プログラミングの専門家のコミュニティを備えた世界最大のプログラミング Q&A Web サイト。 JavaFunctionalProgramming: Java 関数型プログラミングに焦点を当てたコミュニティ フォーラムで、概念、言語機能、ベスト プラクティスについてのディスカッションを提供します。 Redditr/functionjava: Java の関数型プログラミングに焦点を当てたサブレディットで、ツール、ライブラリ、テクノロジに焦点を当てています。 Discord: JavaFunctional Programming: リアルタイムのディスカッション、コード共有、コラボレーションを提供する Discord サービス

Pythonで他の人のコードを使用する方法 Pythonで他の人のコードを使用する方法 May 05, 2024 pm 07:54 PM

他の人の Python コードを使用するにはどうすればよいですか?コード リポジトリを見つける: PyPI や GitHub などのプラットフォームで必要なコードを見つけます。インストール コード: pip を使用するか、GitHub リポジトリのクローンを作成してインストールします。モジュールのインポート: スクリプト内で import ステートメントを使用して、インストールされているモジュールをインポートします。コードの操作: モジュール内の関数とクラスにアクセスします。 (オプション) コードを調整する: プロジェクトに合わせて必要に応じてコードを変更します。

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 May 03, 2024 pm 09:20 PM

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? win11 システムを使用するとき、誰もが時刻やカレンダーを設定しますが、多くのユーザーはコンピューターの時刻が常に間違っていると尋ねます。何が起こっているのでしょうか?ユーザーは下のタスクバーを直接クリックし、taskbarcorneroverflow を見つけてセットアップできます。このサイトでは、Win11 コンピューターの時刻誤差を調整する方法を詳しく紹介します。 Windows 11 でコンピューターの時刻エラーを調整する方法。方法 1: 1. まず、下のタスクバーの空白スペースを右クリックし、[タスクバーの設定] を選択します。方法 2: 1. キーボード ショートカット win+r を押して「ファイル名を指定して実行」を呼び出し、「regedit」と入力して Enter キーを押して確認します。

Java関数開発における一般的な例外の種類とその修復方法 Java関数開発における一般的な例外の種類とその修復方法 May 03, 2024 pm 02:09 PM

Java 関数開発における一般的な例外の種類とその修復方法 Java 関数の開発中に、関数の正しい実行に影響を与えるさまざまな例外が発生する可能性があります。一般的な例外の種類とその修復方法は次のとおりです。 1. NullPointerException 説明: 初期化されていないオブジェクトにアクセスするとスローされます。修正: オブジェクトを使用する前に、オブジェクトが null でないことを確認してください。サンプル コード: try{Stringname=null;System.out.println(name.length());}catch(NullPointerExceptione){

CSSでのオーバーフローとはどういう意味ですか CSSでのオーバーフローとはどういう意味ですか Apr 28, 2024 pm 03:15 PM

オーバーフローは、要素コンテンツがコンテナを超えた場合の表示モードを制御するために使用される CSS のプロパティです。 使用可能な値には、次のものが含まれます。オーバーフローコンテンツを表示するためにスクロールバーが表示されます auto: スクロールバーを表示するかどうかはブラウザが自動的に決定します accept: 親要素のオーバーフロー属性を継承します

Douyin のランダムなアカウントを管理する人はいませんか?二度目の異議申し立てはできますか? Douyin のランダムなアカウントを管理する人はいませんか?二度目の異議申し立てはできますか? May 03, 2024 am 09:37 AM

世界的に有名なショートビデオプラットフォームとして、Douyin には巨大なユーザーベースとコンテンツクリエイターがいます。ただし、プラットフォームのルールは常に更新および改善されているため、一部のユーザーはアカウント禁止に遭遇する可能性があります。これにより、プラットフォーム管理の透明性と公平性について世間の疑問が生じています。この記事では、Douyin アカウントの禁止の問題と、アカウントが禁止された後にユーザーに異議を申し立てる方法があるかどうかについて説明します。 Douyin プラットフォームで禁止される理由は数多くあります。これには、違法なコンテンツ、プラットフォーム規制の違反、他人の権利の侵害などが含まれますが、これらに限定されません。プラットフォームの秩序とユーザーの利益を維持するために、Douyin は一連のルールとレビューメカニズムを確立しました。一部のユーザーがルールに違反した場合、そのアカウントは禁止される場合があります。ただし、一部のユーザーは禁止の理由に疑問を抱いたり、不満を抱いたりする可能性があります。