spring-security-configuration について
spring-security-configurationは、Spring Agent Toolkitに含まれるSpring Security設定生成スキルです。Amplicodeツールでプロジェクト情報を確認し、認証、認可、依存関係、プロパティを例に沿って設定します。
主な機能
- 01WebSecurity設定クラスの生成
- 02認証・認可DSLの設定
- 03プロジェクト情報に基づく設定
- 04必要な依存関係とプロパティの追加
- 05例をコードの参照元として使用
活用シーン
- 01SpringプロジェクトのSpring Security設定
- 02認証要件に応じた設定方式の選択
- 03セキュリティ関連プロパティと依存関係の追加
MCP 対応
Amplicode IntelliJプラグインが提供するSpring MCPサーバーが必要です。Amplicodeツールでプロジェクト概要、依存関係、プロパティ、既存のセキュリティ設定を確認します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ amplicode/ spring-skills --skill spring-security-configurationインストール後、Claude Code で/spring-security-configurationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/_beans/jwt-converter/java.mdkotlin.mdexamples/_beans/ldap-auth-manager/java.mdkotlin.mdexamples/_beans/ldap-context-source/java.mdkotlin.mdexamples/_beans/logout-handler/java.mdkotlin.mdexamples/_beans/role-mapper/java.mdkotlin.mdexamples/_beans/user-storage/java.mdkotlin.mdexamples/_dependencies/authorization-server.mdbase.mdldap.mdoauth-client.mdresource-server.mdexamples/_fragments/anonymous/java.mdkotlin.mdexamples/_fragments/authorize-requests/java.mdkotlin.mdexamples/_fragments/csrf/java.mdkotlin.mdexamples/_fragments/exception-handling/java.mdkotlin.mdexamples/_fragments/form-login/java.mdkotlin.mdexamples/_fragments/headers/java.mdkotlin.mdexamples/_fragments/jwt/java.md詳細
事前確認:Spring MCP
このスキルはSpring Agent Toolkitの一部であり、Spring MCP server(Amplicode IntelliJ プラグインが提供)と連携するように設計されています。ほかの作業を始める前に、ツール一覧に Spring MCP ツールがあるか確認してください。これらのツールはamplicode MCP サーバーの下に公開されます(例:get_project_summary、list_module_dependencies、get_entity_details)。MCP ツールをフラット化してツール一覧に表示するハーネスでは、同じ名前のツールにmcp__amplicode__というプレフィックスが付きます。
- Amplicode ツールが1つ以上利用できる場合 — MCP は接続されています。以下のスキルを続行してください。
- 利用できるツールがない場合 — 停止して、Spring Agent Toolkit に含まれる**
amplicode-installスキルを呼び出してください。このスキルは Amplicode プラグインをインストールし、ウェルカム画面の«Настроить Spring Agent»**ボタンの操作と、MCP クライアントの再起動を案内します。完了すると MCP ツールが利用可能になるので、このスキルを再開してください。 amplicode-installがスキル一覧に登録されていない場合は、ユーザーの言語で次のように伝えてください。「このスキルを使用するには、Amplicode IntelliJ プラグインとその MCP サーバーが必要です。https://amplicode.ru/marketplace から IntelliJ IDEA Ultimate/Community または GigaIDE にインストールし、任意のプロジェクトを開いて、Amplicode のウェルカム画面で«Настроить Spring Agent»をクリックした後、MCP クライアントを再起動してください。」
Spring Security の設定
filterChain()メソッド、認証と認可の DSL チェーン、Bean、依存関係、および application.properties のプロパティを含む@Configuration @EnableWebSecurityクラスを生成します。
重要:コードはexamples/ファイルの例だけを基にしてください。一致する例がない場合は、作業を停止してユーザーに確認してください。 重要:選択肢が決まっている質問では、
AskUserQuestion> その類似ツール > テキストでのリストの順に優先してください。番号付きのテキストリストは、対話型ツールが利用できない場合の最終手段です。 重要:Step 1 を実行する前に会話のコンテキストを確認してください。Step 2~3 の質問の半分は、ユーザーのプロンプトや以前のやり取りですでに回答されている可能性があります。すでに述べられた内容を再度尋ねることが、このスキルの動作が遅く感じられる最大の原因です。
デフォルト
| オプション | デフォルト | 必ず質問する? | 備考 |
|---|---|---|---|
| 認証タイプ | — | YES | 主な分岐 |
| CSRF を無効化 | no | NO | |
| ヘッダーを無効化 | no | NO | |
| 匿名アクセスを無効化 | no | NO | |
| 認可ルール | anyRequest().authenticated() | NO | |
| 言語 | get_project_summary の結果 | NO | 自動検出 |
| bootVersion | get_project_summary の結果 | NO | 自動検出 |
| className | SecurityConfiguration | NO | 提案のみ。確認は任意 |
| packageName | 既存の @Configuration と同じ | NO | 自動検出 |
| appPrefix | 既存の @Value プロパティ、または app | NO | プロジェクトから自動検出 |
スマートデフォルト: ユーザーが「デフォルトを使って」「すべてデフォルトで」「デフォルト設定で」などと言った場合、「必ず質問する?」が NO の質問はすべて省略します。必須の質問のみ行います。
スマート回答の認識: ユーザーが番号付きリストから選ぶ代わりに値を入力した場合、そのまま受け入れます。例:
- 質問「認証タイプは?」→ ユーザーの回答「jwt」→ これを選択として受け入れ、選択肢を表示しません
- 質問「クライアント ID は?」→ ユーザーの回答「my-app」→ この値を受け入れ、再質問しません
- ユーザーが 1 つのメッセージで複数の回答を入力した場合 → すべて受け入れ、回答済みの質問は省略します
- ユーザーがすでに回答した質問は、暗黙的な回答も含め、決して質問しません
質問の一括提示: 以下の条件を満たす、密接に関連する質問は 1 回の
AskUserQuestion 呼び出しにまとめます(1 回につき最大 4 問)。
- 同じ論理セクションに属する(例:どちらも接続設定)
- 互いの回答に依存しない
- ユーザーが省略できる、明確なデフォルトがある
ルール:
- 1 回の
AskUserQuestion呼び出しにつき、質問は最大 3~4 問 - 推奨オプションには
(Recommended)を付け、先頭に配置します - 異なる判断分岐の質問をまとめてはいけません
- 主な分岐となる質問(認証タイプ)は常に単独で質問します
- 選択肢には
AskUserQuestionを優先し、ツールを利用できない場合に限り、プレーンテキストのリストを使用します
判断の原則 — まずコンテキストを確認し、その後質問する
ユーザーに何か質問する前に、すでに収集したコンテキストから回答を導き出します。対象は、プロジェクトの概要、モジュールの依存関係、既存のセキュリティ設定、この会話の前のやり取り、ユーザーの最初のプロンプトです。コンテキストから明確なデフォルトを判断できない場合、または選択が本当にユーザー固有の場合(例:認証タイプ、認可ルール)に限り質問します。
判断の優先順位:
-
コンテキストが明確 → 質問せずに決定します。 例:
get_project_summaryから言語と Boot バージョンを取得する、list_module_dependenciesから既存の依存関係を取得する、既存の@Configurationクラスから packageName を決定する、className をSecurityConfigurationにする、既存の@Valueアノテーションから appPrefix を取得する。 -
コンテキストから有力な手掛かりが得られる → 決定内容と代替案を 1 行で伝え、ユーザーが変更するか、そのままにするかを選べるようにします。 形式:
Will create SecurityConfiguration with JWT (spring-boot-starter-oauth2-resource-server found in dependencies). Alternatives: Form Login, OIDC, LDAP, Custom. OK?ユーザーが「ok」/「yes」と答える、または何も答えない場合はそのまま受け入れます。代替案を指定した場合は、そちらに切り替えます。
-
コンテキストから明確なデフォルトを判断できない → 推奨オプションを先頭にして、
AskUserQuestionで質問します(推奨)。 推奨オプションにはラベル内で(Recommended)を付け、先頭に配置します。選択ツールを利用できない場合は、プレーンテキストのリストを使用します。 -
重要な入力に関するコンテキストがまったくない → 明確に質問します。 これは、認証タイプ(依存関係から手掛かりを得られない場合)、認可ルール、バリアント固有の設定に適用されます。
質問する方法 — AskUserQuestion を優先する
質問が必要な場合は、回答本文に番号付きリストを書くよりも、AskUserQuestion ツールを優先してください。対話型の選択ツールが利用できない場合に限り、通常のテキストで質問します。
このスキルでの AskUserQuestion 呼び出しに関するルール:
- 各呼び出しには、互いに独立した質問を最大 4 件まで含められます。関連する判断をまとめて 1 回のやり取りで行うために活用してください。
- 各質問の選択肢は 2~4 個にします。自由形式の入力用に「その他」の選択肢が自動追加されるため、手動で含めないでください。
- 推奨する選択肢は、ラベルの末尾に
(Recommended)を付けて 最初に配置します。 headerは 12 文字のチップラベルです(例:「Auth Type」、「CSRF」、「Headers」)。
AskUserQuestion が適切でない場合:
- 選択肢を列挙できない自由形式の入力(例:URL、クライアント ID、DN、パターン)— 通常のテキストで質問します。
- 原則 2 の「1 行での確認」— 選択肢を列挙する質問ではなく、はい/いいえで答える質問です。
ユーザーにいかなる種類の認証情報も尋ねないでください(クライアントシークレット、管理者パスワード、API キー、トークンなど)。AskUserQuestion、通常のテキスト、その他いかなる方法でも尋ねてはいけません。認証情報の値を会話に含めないでください。認証情報のフィールドごとに、このスキルは application.properties に環境変数のプレースホルダー(${OAUTH_*_CLIENT_SECRET}、${LDAP_MANAGER_PASSWORD}、${AUTHSERVER_*_CLIENT_SECRET})を設定し、生成後にそのプレースホルダー名をユーザーに知らせます。バリアントごとのリファレンスと _properties/*/properties.md の「secret handling」セクションを参照してください。
ステップ 2~3 およびリファレンスファイルの質問リストは、ケース 4 のフォールバックです。上から順番に実行する手順ではありません。原則 1~3 によって質問への回答がすでに決まっている場合は、その質問を省略してください。
Step 0 -- まず会話のコンテキストを確認する(必須、ツール呼び出しなし)
MCP を呼び出す前、質問する前に、ユーザーのプロンプトとこの会話の過去のやり取りを読み直し、すでに示されている情報を抽出してください。このステップにはコストがかからず、このスキルで最もよく起きる失敗、つまりユーザーがすでに答えたことを尋ねてしまう事態を防げます。
入力項目のチェックリストを頭の中で作り、ユーザーが明示的または暗黙的にすでに提示している情報をすべて確認してください。
| 入力項目 | プロンプト/コンテキストで確認する内容 |
|---|---|
| 認証タイプ | 「JWT」、「フォームログイン」、「OIDC」、「Keycloak」、「LDAP」、「OAuth2」、「認可サーバー」など、直接的または暗示的な言及 |
| プロバイダー | 「Keycloak」、「Google」、「GitHub」、「Okta」、「AWS Cognito」など — OIDC または JWT のバリアントを示します |
| 認可ルール | 「ADMIN のみ」、「パブリック API」、「すべてのエンドポイントを保護」 |
| 言語 | Kotlin/Java — 話し合いの中で言及されたファイル拡張子から推測できる場合もあります |
| className | 「SecurityConfig という名前にする」、「クラス名は XxxConfiguration」 |
| スマートデフォルト | 「デフォルトを使用」、「すべてデフォルト」、「デフォルト設定」、「最小限の設定」 |
| プロジェクトに関する既知の情報 | 言語、Boot のバージョン、依存関係 — この会話ですでに話し合っていれば既知の情報です。再取得しないでください |
明示的または強く暗示された回答がある入力は、すべて決定済みとして印を付け、ステップ 2~3 の該当する質問を省略してください。ユーザーが「JWT を設定」と書いている場合、「認証タイプは?」と尋ねてはいけません。JWT が回答です。ユーザーが「Kotlin で」と書いている場合、言語を尋ねてはいけません。
回答が示されていない入力については、上記の意思決定原則に従ってください。まずプロジェクトのコンテキストから判断できるか試し(ステップ 1)、その後で必要な場合にのみ質問してください。
ステップ 0 は頭の中で行い、ツール呼び出しはしません。ユーザーに知らせないでください。「ステップ 0 完了」とも書かないでください。ステップ 1 に進む前に、ユーザーがすでに話した内容を確認してください。
ステップ 1 -- コンテキストを収集する(自動、質問なし)
Spring MCP ツールを呼び出します(可能な場合は並列で実行します)。
| ツール | 抽出する内容 | 変数名 |
|---|---|---|
get_project_summary | 言語、springBootVersion、moduleName、buildFile、mainPackage | language、bootMajor、moduleName、buildFile、mainPackage |
list_module_dependencies(moduleName) | artifact ID | presentDeps |
list_application_properties_files(moduleName) | properties ファイルへのパス | propsFile |
list_security_configurations | 既存のセキュリティ設定 | existingConfigs |
list_spring_security_roles | 認可ルールに使用する既存のロール | existingRoles |
マルチモジュールプロジェクトの場合(get_project_summary に複数のモジュールが含まれる場合):
使用するモジュールを尋ねます。その後、そのモジュールを指定してモジュール固有の MCP ツールを再度呼び出します。
existingConfigs が空でない場合:
- ユーザーに警告します:「プロジェクトにはすでにセキュリティ設定があります:{list}。追加で作成しますか?」
- ユーザーが確認した場合 — 既存の名前と重複しない
{className}を提案します - ユーザーが断った場合 — 停止します
プロジェクト内の既存の @Value アノテーションを調べて、共通するカスタムプレフィックスがあるか確認し、appPrefix を決定します
(例:@Value("${myapp.something}") → appPrefix = myapp)。見つからない場合は、app をデフォルトとして使用します。
ステップ 2 -- 認証タイプ
質問します:
Authentication type?
1. Form Login (HTTP Session) -- form login with session
2. JWT (OAuth2 Resource Server) -- stateless JWT
3. OAuth2/OIDC Login -- login via external provider (Keycloak, Google, GitHub...)
4. Authorization Server -- own authorization server (Spring Boot >= 3.1)
5. LDAP -- LDAP authentication
6. Custom -- empty filterChain, only common DSL blocks
回答を参照ファイルに対応付けます:
- 1 ->
references/http-session.md - 2 ->
references/jwt.md - 3 ->
references/oidc.md - 4 ->
references/authorization-server.md(bootMajor >= 3.1 が必要です。下回る場合はユーザーに警告し、別のタイプを選択するよう尋ねます) - 5 ->
references/ldap.md - 6 ->
references/custom.md
ステップ 3 -- バリアント固有の質問(インライン)
対応する参照ファイルを読み、質問の流れに従います。 ユーザーが「all defaults」と答えていない場合にのみ質問します。
各参照ファイルでは、以下を指定します:
- 含めるフラグメント
- 生成する Bean
- 追加する依存関係
- 設定するプロパティ
- バリアント固有の質問
ステップ 4 -- コードを生成する
-
examples/_skeletons/{lang}.mdからスケルトンを読み込みます。{lang}はステップ 1 のjavaまたはkotlinです。 -
スケルトンを使用して設定クラスファイルを作成し、
{packageName}と{className}を置換します。 -
選択したバリアントのリファレンスファイルを読み込みます。記載された各フラグメントについて、次の操作を行います。
examples/_fragments/{feature}/{lang}.mdからフラグメントファイルを読み込みます。- 適切なコードバリアントを
filterChainメソッド本体のreturn http.build();より前に挿入します。 - **正しいバージョンのバリアントを選択します。**ステップ 1 の
bootMajorに基づいてください(フラグメントによっては Boot < 3.1 / Boot >= 3.1 のセクションがあります。一致する方を使用してください)。 - 変数を置換します(Variables セクションで宣言された変数のみ)。
- ユーザーが選択したオプションに一致する行のみを含めます(コメントアウトされた条件付き行は省略します)。
-
filterChainメソッド内の DSL の順序(重要 — 順序はバリアントによって異なります)。正確なバリアントごとの順序については、
references/common-dsl.md→ "Generation Order" を参照してください。 最後は必ずreturn http.build();にしてください。 -
リファレンスに記載された各 Bean について、次の操作を行います。
examples/_beans/{bean-type}/{lang}.mdから Bean ファイルを読み込みます。- Bean メソッドを設定クラス本体に追加します。
- **重要:**すべての Bean メソッドを
filterChainDSL から参照する必要があります。 使用されないメソッドは作成しないでください。 - Bean に自動配線フィールド(例:
clientRegistrationRepository)が必要な場合は、クラスに追加します。
-
変数の置換ルール:
{packageName}→ ステップ 1 のコンテキストから取得{className}→ ユーザー指定の値、またはデフォルト値- その他の変数 → ユーザーの回答、またはデフォルト値
- Variables に記載されていないものは絶対に置換しないでください。
- 例にないインポート、メソッド、コードは絶対に追加しないでください。
- **完全修飾名はインポートでのみ使用し、本文では簡潔なクラス名を使用します。**例にはインラインに完全修飾名が含まれている場合があります(例:
new org.springframework.security.web.SecurityFilterChain(...))。 コードを生成する際は、完全修飾名をインポート文に移し、コード本文では短いクラス名を使用します。 生成ファイルは、通常の手書きコードのようにしてください。
ステップ 5 -- 依存関係とプロパティ(自動)
_dependencies/base.mdを読み込みます(常に読み込みます)。- バリアント固有の依存関係ファイルを読み込みます(リファレンスファイルを参照)。
bootMajorに基づいて正しいバージョンのバリアントを選択します(ステップ 1 を参照)。- 依存関係ファイルには Boot 3.x / Boot 4.x のセクションがあります。
bootMajorに一致する方を使用します。 - Boot 4.x では OAuth2 のアーティファクト名が変更されています。
spring-boot-starter-oauth2-*→spring-boot-starter-security-oauth2-* - Boot 3.0 の Authorization Server では、手動で
spring-security-oauth2-authorization-server:1.1.0を追加する必要があります(スターターはありません)。
- 依存関係ファイルには Boot 3.x / Boot 4.x のセクションがあります。
presentDepsに含まれていない各アーティファクトについて、次の操作を行います。- ステップ 1 の
buildFileを使用します。 - ビルドファイルを編集して依存関係を追加します。
- ステップ 1 の
refresh_build_system_modelを呼び出します。_properties/{variant}/properties.mdからバリアント固有のプロパティファイルを読み込みます。- アプリケーションのプロパティファイルに書き込み、または追記します。
- 次の形式で報告します:「追加した依存関係:[一覧]。application.properties に書き込んだ項目:[キー]」
- 生成されたプロパティに、認証情報用の
${...}環境変数プレースホルダー(OAUTH_*_CLIENT_SECRET、LDAP_MANAGER_PASSWORD、AUTHSERVER_*_CLIENT_SECRET)が含まれている場合は、すべてのプレースホルダーを明示して一覧にし、アプリを実行する前に環境変数を設定するようユーザーに指示します(シェルのexport、IDE の実行設定、またはデプロイ先のシークレットストアを使用)。**シークレット自体の値をユーザーに尋ねてはいけません。**シークレットを会話履歴に含めてはいけません。
ハルシネーション防止チェックリスト
コードを書く前に、必ず以下を確認してください。
- コードが
examples/ファイルに記載されている(どのファイルかを明記する) - 置き換えたのは宣言済みの変数だけである
- 「知識をもとに」フレームワークの API 呼び出しを追加していない
- インポートは、例で使用されている FQN から導き出されている(余分なものも不足もない)
- メソッドシグネチャが例と完全に一致している
- コメントや便利なメソッドを追加していない
- 例にある FQN をインポートに抽出しており、コード本体では短いクラス名のみを使用している
-
filterChain内の DSL の順序が、手順 4 で定義されたバリアント固有の順序に従っている(HTTP Session/JWT:authorizeHttpRequestsが先、OIDC:oauth2Login、次にlogout、最後にauthorizeHttpRequests) - ヘルパーメソッド(
jwtAuthenticationConverter、oidcClientInitiatedLogoutSuccessHandler)に@Beanを付けていない。これらはfilterChainから直接呼び出すパブリックメソッドである。注:汎用プロバイダーではuserAuthoritiesMapperに@Beanを付けるが、Keycloak では付けない(role-mapper bean ファイルを参照) - 生成されたすべての Bean メソッドが、
filterChainDSL または別の Bean から実際に参照されており、孤立したメソッドがない - HTTP Session の場合:User Storage が設定されていれば、
filterChainにhttp.userDetailsService(...)呼び出しがある - HTTP Session の場合:デフォルト以外のログアウトオプションが設定されている場合にのみ、ログアウト DSL を生成する(Spring Security ではログアウトがデフォルトで自動的に有効になる)
- バージョン固有のコード/依存関係が
bootMajorと一致している。Boot 4.x ではspring-boot-starter-oauth2-*ではなくspring-boot-starter-security-oauth2-*を使用する。セッション管理の同時セッション API は Boot 3.1 で変更された