복붙노트

[REDIS] 봄 부팅 레디 스 : 어떻게 사용자의 모든 세션을 무효화?

REDIS

봄 부팅 레디 스 : 어떻게 사용자의 모든 세션을 무효화?

나는 레디 스에 새입니다. 나는 레디 스와의 HttpSession을 사용하려면이 튜토리얼을 따라했습니다.

https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html

이제 내 응용 프로그램은 옵션 '모든 기기에서 로그 아웃'했다. 그 클릭하면 어떻게 제거하거나 해당 사용자의 모든 세션을 무효화합니까?

사용자가 자신의 암호를 변경하는 경우 또한, 어떻게 현재 세션을 제외한 그의 모든 세션을 무효화합니까?

편집하다:

나는 세션 레지스트리를 사용했습니다.

@Autowired
private FindByIndexNameSessionRepository sessionRepository;

@Autowired
FindByIndexNameSessionRepository<? extends ExpiringSession> sessions;

@RequestMapping(value = "/logoutalldevices", method = RequestMethod.GET)
public Response test(HttpServletRequest request, HttpServletResponse response) throws Exception {

    SpringSessionBackedSessionRegistry sessionRegistry = new SpringSessionBackedSessionRegistry(sessionRepository);

    Collection<? extends ExpiringSession> usersSessions = sessions
            .findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, "myUserId")
            .values();

    usersSessions.forEach((temp) -> {
        String sessionId = temp.getId();
        // sessionRegistry.removeSessionInformation(sessionId);
        SessionInformation info = sessionRegistry.getSessionInformation(sessionId);
        info.expireNow();
    });

    return Response.ok().build();
}

그러나 레디 스 DB를에서 세션을 제거하거나 무효화되지 않습니다. 이라는 세션에 새로운 속성 추가 비록 : 진정한 가치와 'sessionAttr을 org.springframework.session.security.SpringSessionBackedSessionInformation.EXPIRED'. 나는 내가 할 때 레디 스 사용하여 클라이언트 DB를 레디 스에서이 새로운 키 값 쌍을 볼 수 있습니다

HGETALL '세션 ID'

편집하다

나는 redistemplate를 사용하여 DB 레디 스에서 수동으로 세션을 삭제했습니다.

@Autowired
RedisTemplate<String, String> redisTemplate;

---------

redisTemplate.delete("spring:session:sessions:" + sessionId);
redisTemplate.delete("spring:session:sessions:expires:" + sessionId);

이 거의 작동합니다. 그것은 레디 스의 DB에서 값이 아닌 키를 삭제합니다.

127.0.0.1:6379> keys *
1) "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
2) "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
3) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:1"
127.0.0.1:6379> hgetall spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7
1) "lastAccessedTime"
2) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01[R'\x15\xc1"
127.0.0.1:6379> 

그것은 lastAccessedTime 시간을 제외하고 세션 내에서 다른 모든 키 값 쌍을 삭제.

또 하나는 이것이 이상한,이 redisTemplate.delete이 ( "키") 실행될 때 내가 레디 스 모니터에서 볼 수있는 로그는 다음과 같습니다

1491731944.899711 [0 127.0.0.1:62816] "DEL" "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
1491731944.899853 [0 127.0.0.1:62816] "DEL" "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"

내가 복사 레디 스 - 클라이언트에 위의 두 명령을 붙여 실행하면, 키가 삭제됩니다. 내가 키가 더 이상 * 실행할 때 나는 키가 표시되지 않습니다. 그것 RedisTemplate을 사용하여 삭제하면 키가 삭제되지 않는 이유를 궁금해

127.0.0.1:6379> "DEL" "spring:session:sessions:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
(integer) 1
127.0.0.1:6379> "DEL" "spring:session:sessions:expires:25635a14-a4f1-4aa1-bf5a-bc20f972eec7"
(integer) 1
127.0.0.1:6379> keys *
1) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:1"
127.0.0.1:6379>

해결법

  1. ==============================

    1.난 당신이 사용자 세션을 무효화에 대한 올바른 경로를 따르고 있는지를 알고 싶습니다

    난 당신이 사용자 세션을 무효화에 대한 올바른 경로를 따르고 있는지를 알고 싶습니다

        usersSessions.forEach((session) -> {        
            sessionRegistry.getSessionInformation(session.getId()).expireNow();
        });
    

    참고 일도

    SessionInformation.expireNow()
    

    당신이 바르게 설명한대로 레디 스 데이터베이스에서 항목을 제거하는 것을 의미하지 않습니다, 그것은 단지 세션 만료 속성을 추가합니다.

    그러나 이것은 사용자의 세션을 무효화하는 방법?

    여기에 ConcurrentSessionFilter 재생 곳으로 온다 .doFilter () 메소드는 자동으로 로그 아웃의 트릭을 수행

    여기 ConcurrentSessionFilter의 조각이다

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
    
        HttpSession session = request.getSession(false);
    
        if (session != null) {
            SessionInformation info = sessionRegistry.getSessionInformation(session
                    .getId());
    
            if (info != null) {
                if (info.isExpired()) {
                    // Expired - abort processing
                    doLogout(request, response);
    
                    String targetUrl = determineExpiredUrl(request, info);
    
                    if (targetUrl != null) {
                        redirectStrategy.sendRedirect(request, response, targetUrl);
    
                        return;
                    }
                    else {
                        response.getWriter().print(
                                "This session has been expired (possibly due to multiple concurrent "
                                        + "logins being attempted as the same user).");
                        response.flushBuffer();
                    }
    
                    return;
                }
                else {
                    // Non-expired - update last request date/time
                    sessionRegistry.refreshLastRequest(info.getSessionId());
                }
            }
        }
    
        chain.doFilter(request, response);
    }
    

    그 건배!

  2. ==============================

    2.삭제 키 위해 이것을보십시오. "redisTemplate.opsForValue () getOperations () (KEY) 삭제할."

    삭제 키 위해 이것을보십시오. "redisTemplate.opsForValue () getOperations () (KEY) 삭제할."

  3. ==============================

    3.이 시도

    이 시도

    usersSessions.forEach((session) -> {        
            sessionRegistry.delete(session.getId());
      });
    
  4. ==============================

    4.방금 디버깅 과정에서 한 번 일을하려는 경우, 당신은 단지 로그인에 레디 스 CLI 및 모든 레디 스 키를 세척 할 수 있습니다.

    방금 디버깅 과정에서 한 번 일을하려는 경우, 당신은 단지 로그인에 레디 스 CLI 및 모든 레디 스 키를 세척 할 수 있습니다.

    $ redis-cli
    127.0.0.1:6379> KEYS *
    1) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:bbb"
    2) "spring:session:expirations:1558782600000"
    3) "spring:session:expirations:1558783140000"
    4) "spring:session:sessions:expires:953146bf-7300-4394-bbf0-bf606ff6b326"
    5) "spring:session:expirations:1558782540000"
    6) "spring:session:sessions:953146bf-7300-4394-bbf0-bf606ff6b326"
    127.0.0.1:6379> FLUSHALL
    OK
    127.0.0.1:6379> KEYS *
    (empty list or set)
    127.0.0.1:6379>
    
  5. from https://stackoverflow.com/questions/43090679/spring-boot-redis-how-to-invalidate-all-sessions-of-a-user by cc-by-sa and MIT license