11

私の質問は、分散 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 です。

  1. http://docs.spring.io/spring-session/docs/1.1.0.M1/reference/html5/guides/findbyusername.html
  2. 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 に何かを伝えることはできません。現在ログインしているすべての有効なセッションとその現在のユーザーを教えてください。それ)。

ありがとうございました

4

2 に答える 2