Spring Session - MongoDB リポジトリ

このガイドでは、MongoDB がサポートする Spring Session の使用方法について説明します。

依存関係の更新

Spring Session MongoDB を使用する前に、依存関係を更新する必要があります。動作している Spring Boot Web アプリケーションを使用していることを前提としています。Maven を使用している場合は、必ず次の依存関係を追加してください。

pom.xml
<dependencies>
	<!-- ... -->
	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-mongodb</artifactId>
	</dependency>
</dependencies>

Spring の設定

必要な依存関係を追加した後、Spring 構成を作成できます。Spring 構成は、HttpSession 実装を Spring Session に基づく実装に置き換えるサーブレットフィルターを作成するロールを果たします。

次の Spring 構成を追加するだけです。

@Configuration(proxyBeanMethods = false)
@EnableMongoHttpSession (1)
public class HttpSessionConfig {

	@Bean
	public JdkMongoSessionConverter jdkMongoSessionConverter() {
		return new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)
	}

}
1@EnableMongoHttpSession アノテーションは、フィルターを実装する springSessionRepositoryFilter という名前の Spring Bean を作成します。このフィルターは、デフォルトの HttpSession を MongoDB でサポートされている Bean に置き換えるものです。
2 セッションタイムアウトを 30 分に設定します。

MongoDB 接続の構成

Spring Boot は、Spring Session をポート 27017(デフォルトポート)でローカルホスト上の MongoDB サーバーに接続する MongoClient を自動的に作成します。本番環境では、MongoDB サーバーを指すように構成を更新する必要があります。例: application.properties に以下を含めることができます

src/main/resources/application.properties
spring.data.mongodb.host=mongo-srv
spring.data.mongodb.port=27018
spring.data.mongodb.database=prod

詳細については、Spring Boot ドキュメントの MongoDB に接続する部分を参照してください。

サーブレットコンテナーの初期化

Spring の設定は、Filter を実装する springSessionRepositoryFilter という名前の Spring Bean を作成しました。springSessionRepositoryFilter Bean は、HttpSession を Spring Session によるカスタム実装に置き換えるロールを果たします。

Filter がその魔法を実行するために、Spring は Config クラスをロードする必要があります。最後に、サーブレットコンテナー(Tomcat など)がすべてのリクエストに springSessionRepositoryFilter を使用していることを確認する必要があります。幸い、Spring Boot がこれらの両方の手順を実行してくれます。

MongoDB サンプルアプリケーション

MongoDB サンプルアプリケーションは、Spring Boot を使用するときに、Spring Session を使用して MongoDB を透過的に活用し、Web アプリケーションの HttpSession をバックアップする方法を示しています。

MongoDB サンプルアプリケーションの実行

サンプルを実行するには、ソースコードを取得し、次のコマンドを呼び出します。

$ ./gradlew :samples:mongo:bootRun

これで、localhost:8080/ でアプリケーションにアクセスできるようになります。

セキュリティサンプルアプリケーションの調査

アプリケーションを使用してみてください。次のように入力してログインします。

  • ユーザー名 user

  • パスワード password

次に、ログインボタンをクリックします。以前に入力したユーザーでログインしていることを示すメッセージが表示されます。ユーザーの情報は、Tomcat の HttpSession 実装ではなく MongoDB に保存されます。

それはどのように機能しますか?

Tomcat の HttpSession を使用する代わりに、実際には Mongo の値を永続化しています。Spring Session は、HttpSession を Mongo による実装に置き換えます。Spring Security の SecurityContextPersistenceFilter が SecurityContext を HttpSession に保存すると、Mongo に永続化されます。

新しい HttpSession が作成されると、Spring Session は、セッションの ID を含む SESSION という名前の Cookie をブラウザーに作成します。先に進み、Cookie を表示します(Chrome (英語) または Firefox (英語) のヘルプについてはクリックしてください)。

必要に応じて、mongo クライアントを使用してセッションを簡単にインスペクションできます。例: Linux ベースのシステムでは、次のように入力できます。

サンプルアプリケーションは、ランダムに割り当てられたポートでリッスンする組み込みの MongoDB インスタンスを使用します。組み込み MongoDB がそれに接続するための正確なコマンドとともに使用するポートは、アプリケーションの起動時にログに記録されます。

$ mongo --port ...
> use test
> db.sessions.find().pretty()

または、明示的なキーを削除することもできます。60f17293-839b-477c-bb92-07a9c3658843 を SESSIONCookie の値に置き換えるように、ターミナルに次のように入力します。

> db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})

次に、localhost:8080/ のアプリケーションにアクセスして、認証されなくなったことを確認します。