KeyCloak

Spring Boot と Keycloak で SAML 認証を実装する完全ガイド

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

SAML の基本概念と Keycloak が提供する SAML IdP の概要

SAML は企業向けシングルサインオンで長年採用されている XML ベースの認証プロトコルです。本章では、SAML の基本構造と OIDC との違いを整理し、Keycloak(現在の安定版は 24.x 系)で利用できる SAML IdP の主要機能を概観します。

ポイント:SAML は証明書ベースの署名・暗号化が標準装備されているため、セキュリティ要件が高いシナリオに適しています。

SAML と OIDC の違い

SAML と OpenID Connect(OIDC)は目的は同じでも設計思想が大きく異なります。以下の比較でそれぞれの特徴を把握してください。

  • プロトコル形式
  • SAML: XML、X.509 証明書による署名・暗号化。
  • OIDC: JSON Web Token(JWT)+ OAuth2.0 の軽量 HTTP/JSON。

  • フローの複雑さ

  • SAML: リダイレクト + POST バインディングが標準で、設定項目が多い。
  • OIDC: Authorization Code フローだけで完結し、実装がシンプル。

  • 導入シーン

  • SAML: 大規模エンタープライズ、レガシーシステム、社内ポータル等。
  • OIDC: モバイル・SPA・マイクロサービスなど軽量クライアント。

Keycloak の SAML IdP が提供する主な機能

Keycloak は認証・属性マッピング・SSO/Logout をワンストップで提供します。特に以下の点が実務で有用です。

  • 標準的な IdP 機能:認証、シングルサインオン/アウト、SAML アサーションの生成。
  • 属性・ロール付与:ユーザー属性や LDAP/AD グループをアサーションに組み込み可能。
  • 署名・暗号化設定:X.509 証明書でメタデータ全体、あるいは個別要素の署名ができる。
  • マルチテナント対応:Realm を分割してプロジェクトごとに設定を独立させられる。

注意:Keycloak 25 系や Spring Boot 3.3 は執筆時点ではリリース未定です。この記事では「現在安定版(Keycloak 24.x、Spring Boot 3.2系)」を前提にしています。


開発環境と必須依存ライブラリ

この章ではローカル開発に必要なツール・バージョンと、SAML 認証に最低限 required な Maven / Gradle 依存関係を示します。

前提条件

項目 バージョン (推奨)
Java 17 以上(LTS)
Spring Boot 3.2.x(最新安定版)
Maven / Gradle Maven 3.9+、Gradle 8.5+
Keycloak Server 24.x 系(Docker イメージ quay.io/keycloak/keycloak:24.0
Docker Desktop/Engine 20.10 以上
  • Docker 上で公式イメージを起動すれば環境構築が容易です。
  • 本稿では OpenSAML 4.x を内部的に利用しますので、追加依存も明記します。

必要な Maven / Gradle 依存

ポイントspring-security-saml2-service-provider が SAML 2.0 の公式サポートを提供し、Keycloak 用アダプタは不要です。OpenSAML はメタデータのパースや署名検証に内部で使用されます。


Keycloak 側での Realm と SAML クライアント設定手順

このセクションでは、Keycloak の管理コンソール上で Realm を作成し、SAML 用クライアントと属性マッピングを構築するまでの具体的な操作手順を示します。正しい設定がないと Spring Boot 側で「メタデータ取得失敗」や「属性未取得」のエラーになります。

Realm の作成と基本設定

  1. 管理コンソールに admin アカウントでログイン
  2. 左メニュー RealmAdd realm をクリックし、saml-demo 等の名前を入力して Create
  3. Login タブで「メールアドレスは必須」やパスワードポリシーなど、組織に合わせた認証設定を行う

UI は Keycloak 24.x 系でも大きく変わっておらず、上記手順で問題なく作成できます。

SAML クライアントの登録

  1. 作成した Realm の ClientsCreate
  2. Client IDspring-boot-saml-sp を入力し、Client Protocolsaml を選択
  3. Settings タブで以下を設定(※全角文字は使用しない)
項目 推奨値
Valid Redirect URIs http://localhost:8080/login/saml2/sso/keycloak-saml
Base URL http://localhost:8080/
Master SAML Processing URL (ACS) 自動生成された URL が上記と同一になることを確認
  1. SaveInstallation タブへ移動し、Format OptionsSAML Metadata IDPSSODescriptor を選択して Download

ダウンロードした XML ファイルは Spring Boot の metadata-uri としてそのまま使用できます。

メタデータ・証明書の取得

  1. クライアント画面の Keys タブを開く
  2. Certificate 欄に表示された PEM 形式の X.509 証明書をコピーし、プロジェクト src/main/resources/certificate/keycloak.crt に保存
  3. 同タブで Active がチェックされていることを必ず確認(無効化されていると署名検証が失敗します)

属性マッピングの詳細設定(email・roles)

Keycloak では「Mapper」機能でユーザー属性やロールを SAML アサーションに追加できます。ここでは emailrole list を例示します。

email マッパーの作成手順

  1. クライアント詳細画面の MappersCreate
  2. Mapper Type: User Property
  3. Name: email
  4. Property: email(Keycloak のユーザープロパティ名)
  5. Friendly Name: emailSAML Attribute Name: emailAttribute Friendly Name: email
  6. Add to ID tokenAdd to access token は不要だが、Add to user info にチェックを入れる(デバッグ時に便利)

roles マッパーの作成手順

  1. MappersCreate
  2. Mapper Type: Group Membership または Role List (組織で管理している対象によって選択)
  3. Name: roles
  4. Token Claim Name: rolesSAML Attribute Name: rolesAttribute Friendly Name: Roles
  5. Full group pathfalse(ロール名だけを渡す)に設定

これらのマッパーが正しく設定されていないと、Spring Boot 側で attribute not found: email 等のエラーになります。


Spring Boot アプリ側の実装

本章では取得したメタデータと証明書を用いた Spring Security の設定例を示します。YAML と Java Config 両方を掲載し、どちらでも同等に機能することが確認できます。

application.yml による RelyingPartyRegistration 設定

ポイントmetadata-uri は Keycloak が提供するエンドポイント、certificate-location には先ほど保存した PEM ファイルを指定します。

OpenSamlMetadataResolver を用いた Java Config(エラーハンドリング付き)

重要ポイント

項目 説明
OpenSAML 初期化 InitializationService.initialize() が必須。未実行だと NoClassDefFoundError が発生します。
例外ハンドリング メタデータ取得失敗や XML パースエラーは Optional と明示的な例外で上位に伝搬させます。
追加依存 opensaml-coreopensaml-saml-impl が必須です(pom に記載済み)。

SecurityFilterChain の設定

  • hasRole("ADMIN") は後述の属性マッピングで付与したロールが ROLE_ADMIN として変換されることを前提にしています。

カスタム属性マッピングと UserDetailsService

  • SecurityConfig に以下を追記すると、カスタムコンバータが自動的に利用されます。


動作確認・デバッグ・ベストプラクティス

実装後はローカルでフロー全体を検証し、よくある落とし穴を事前に回避できるようにします。

ログイン/ログアウトフローのテスト手順

  1. アプリ起動
    bash
    ./mvnw spring-boot:run # または ./gradlew bootRun
  2. ブラウザで http://localhost:8080/ にアクセスし、画面左上に表示される「Login」リンクをクリック → Keycloak のログイン画面へリダイレクト
  3. ユーザー名・パスワードで認証 → 成功するとホームページに戻り、右上に Principal: <email> が表示されれば OK
  4. /logout エンドポイント(例:http://localhost:8080/logout)へアクセスし、Keycloak 側でもセッションが破棄されたことを確認

時刻同期と HTTPS 設定

  • 時刻ずれは SAML の有効期限検証で InvalidTimeWindowException を引き起こすため、サーバ・Keycloak コンテナ共に NTP 同期を必須とします。
  • 本番環境では自己署名ではなく、信頼できる CA 発行の証明書で HTTPS 化してください。Spring Boot の server.ssl 設定例は以下です。

よくあるエラーと対処法

エラーメッセージ 主な原因 推奨対策
metadata URL not found (404) Realm 名やポートが間違っている コンテナの公開ポート (8080 vs 8443) と Realm パス /realms/{realm} を再確認
Signature verification failed 証明書が古い・Keycloak 側でローテーションされた Keycloak の Keys タブから最新証明書を再エクスポートし、keycloak.crt を上書き
Attribute not found: email アサーションに email が含まれていない クライアント → Mappersemail マッパーを追加(上記手順参照)
InvalidTimeWindowException サーバ時刻がずれているか、トークン有効期限が短すぎる NTP 同期または spring.security.saml2.accepted-clock-skew=120 で許容範囲を拡大
org.opensaml.core.config.InitializationException OpenSAML が初期化されていない @PostConstructInitializationService.initialize() を必ず呼び出す

ロギングでのデバッグ方法

  • デバッグ実行時はコンソールに大量の XML が出力されるので、grep "Assertion" で必要箇所だけ抽出すると見やすくなります。

サンプルリポジトリと参考リンク

以下の GitHub リポジトリが本稿のフル実装例です。クローン後は docker-compose.yml が Keycloak コンテナと PostgreSQL を自動起動し、初期 Realm/Client がスクリプトで作成されます。

  • リポジトリ: https://github.com/example-org/keycloak-saml-springboot-sample
  • README の主な項目
  • 必要環境(Java 17, Docker, Spring Boot 3.2)
  • docker-compose up -d で起動する手順と初期データの自動ロード方法
  • 完全版 application.ymlSecurityConfig、サンプルコントローラ (HomeController, AdminController) のコード
  • ローカル HTTPS 設定(自己署名証明書生成スクリプト)

公式ドキュメント・参考リンク

  • Keycloak 公式サイト: https://www.keycloak.org/
  • Spring Security SAML2 ガイド: https://docs.spring.io/spring-security/reference/servlet/saml2/login.html
  • OpenSAML 4.x API ドキュメント: https://wiki.shibboleth.net/confluence/display/OpenSAML/Home

以上で、Keycloak を IdP とした SAML 認証を Spring Boot アプリに組み込む手順が完結します。正しい属性マッピングと証明書管理 が最も障害の発生しやすいポイントですので、設定変更後は必ずメタデータ再取得・ログインテストを実施してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-KeyCloak