最新の安定バージョンについては、Spring Session 3.4.3 を使用してください! |
Spring Session - MongoDB リポジトリ
依存関係の更新
Spring Session MongoDB を使用する前に、依存関係を更新する必要があります。動作している Spring Boot Web アプリケーションを使用していることを前提としています。Maven を使用している場合は、必ず次の依存関係を追加してください。
<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 に以下を含めることができます
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/ のアプリケーションにアクセスして、認証されなくなったことを確認します。