【Keycloak 26.0.0】ユーザーセッションが永続化されたので試してみた!
こんにちは、やまだゆうです。
大好きなKeycloakに革命的な機能改善が実装されたので、ご紹介します!
これまでキャッシュ(infinispan)にしか保存されなかったユーザーセッションが、データベースに保存されるようになりました。
これにより以下の場面でログイン状態が維持できるようになりました。
- すべてのKeycloakインスタンスを再起動したとき
- Keycloakをアップグレードするとき
Keycloakは実務でも使っていて、アップグレード作業をやったことがあるのですがユーザーセッションが切れてしまうのが社内でも非常に問題視されていました。
バージョン25でプレビュー機能として実装されて、バージョン26でデフォルト有効化されるようになりました。
- バージョン25:Persistent user sessions
- バージョン26:User sessions persisted by default
スポンサーリンク
セッションが永続化されていることを確認してみよう
こちらの議論に記載されているようにoffline_user_sessionテーブルにoffline_flag=0でデータが保存されていれば、ユーザーセッションがデータベースに保存されていることになります。

今回はこのユーザーセッションの永続化機能を実際に検証してみます。
具体的には、Keycloakでユーザーを作成してログインし、その後Keycloakのコンテナを再起動してもセッションが維持されているかを確認します。
これによって、運用環境でのメンテナンスやアップグレード時にユーザーエクスペリエンスがどう改善されるかを見ていきましょう。
Keycloak v26を実行する
以下のcompose.ymlを使います。ぼくのGithubで公開していますので、ご利用ください!
services:
mysql:
image: mysql:8.0.42
container_name: keycloak-v26-mysql
volumes:
- keycloak-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: keycloak
MYSQL_USER: db-user
MYSQL_PASSWORD: password
ports:
- 3306:3306
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u$${MYSQL_USER}", "-p$${MYSQL_PASSWORD}"]
interval: 10s
timeout: 5s
keycloak:
image: keycloak/keycloak:26.3.1
container_name: keycloak-v26
ports:
- 4000:8080
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: password
KC_HTTP_RELATIVE_PATH: /auth
KC_DB: mysql
KC_DB_URL_HOST: mysql
KC_DB_URL_DATABASE: keycloak
KC_DB_USERNAME: db-user
KC_DB_PASSWORD: password
TZ: Asia/Tokyo
command: start-dev
depends_on:
mysql:
condition: service_healthy
volumes:
keycloak-mysql-data:
external: true
networks:
default:
name: keycloak-network
external: true
リポジトリのREADMEにも記載しているとおり、事前にボリュームとネットワークを作ります。
docker volume create keycloak-mysql-data
docker network create keycloak-network
docker composeを実行します。
docker compose up
スポンサーリンク
adminユーザーでログインする
起動したKeycloakにadminユーザーでログインします。
ぼくのGithubリポジトリからKeycloakを起動している場合は、http://localhost:4000/auth からコンソールにアクセスできます。
adminユーザーでログイン後、MySQL Workbenchなどで以下のクエリを実行してセッションが保存されているか確認します。
SELECT * FROM keycloak.OFFLINE_USER_SESSION;

確認できたらDockerコンテナを終了して、もう一度起動しましょう。
再び http://localhost:4000/auth にアクセスして、ログイン画面を経由せずにコンソールに入れたら永続化されていることの確認が完了です!
yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村