私の質問は、分散 Web アプリケーションでは、RedisOperationSessionRepository
. (つまり、Redis ストアに入れるための明示的なコードを書きたくないので、後でそれを読み取ります。フレームワークまたはspring-data-redis
ライブラリがそれを提供しているかどうかを理解したいのです)。
Spring Redis はセッションを復元でき、セッションがまだ有効な場合はサーバーの再起動でもログインが保持されることを認識しています (Redis によってサポートされているため)。
私が探している機能の 1 つは、現在アプリケーションにログインしている可能性のあるすべてのユーザーを取得することです。SessionRegistryImpl
、およびこの方法を認識しています。しかし、このメソッドはRedisによってサポートされておらず、サーバーの再起動後、ログインユーザーが返されないことに気付きました.
public List<Object> getAllPrincipals() {
return new ArrayList<Object>(principals.keySet());
}
私が試すことができる機能の 1 つは、Spring Session 1.1.0 の Spring session find by username です。
- http://docs.spring.io/spring-session/docs/1.1.0.M1/reference/html5/guides/findbyusername.html
- https://spring.io/blog/2015/11/17/spring-session-1-1-0-m1-released
試してみたところ、実際に有効なセッション結果が返されましたが、問題は、このアプリケーションを使用している現在の有効なユーザー名をすべて知る必要があることです。(Redis Store を使用してそれらを取得する方法がわかりません。ここでも Redis に保存して取得できますが、より良い方法があるかどうか知りたいです)。
これはコードの一部です。これは、セッション ID がわかっている場合に、現在システムを使用している多くのユーザーの 1 人から現在のユーザーを取得できる方法です。
final Session session = redisOperationsSessionRepository.getSession(sessionid);
final Object obj = session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
if (obj instanceof SecurityContext) {
final SecurityContext context = (SecurityContext) obj;
final Authentication authentication = context.getAuthentication();
if (authentication != null) {
final Object principal = authentication.getPrincipal();
if (principal != null && principal instanceof CurrentUser) {
return (CurrentUser) principal;
}
}
}
これで、上記のロジックを使用して現在のユーザーをすべて取得できますが、Redis ストアから取得する方法がわからない有効なセッション ID をすべて取得する必要があります。
新しい更新:
https://github.com/spring-projects/spring-session/issues/255
このリンクでは、おそらくすべてのセッション ID を取得して、アクティブなセッションを探すことRedisOperationSessionRepository
ができますが、パフォーマンスの問題が発生する可能性があります。
私が自分自身を明確にしたかどうかはわかりませんが、Spring セッション API を使用して Redis に何かを伝えることはできません。現在ログインしているすべての有効なセッションとその現在のユーザーを教えてください。それ)。
ありがとうございました