重定向引发异常(身份验证失败)后,在Spring Security中删除会话

时间:2019-04-12 09:43:18

标签: spring spring-security

我正在实现Oauth2授权代码流程。客户端将请求发送到服务器

http://localhost:8085/oauth/authorize?client_id=14366&redirect_uri=http://localhost:9999/ui/login&response_type=code&scope=read&

由于用户未通过身份验证,它将重定向到登录页面。在此过程中,它将创建一个会话,并将其存储在redis中(通过RedisHttpSessionConfiguration启用)。

我还将最大会话数配置为1

  http.sessionManagement()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true)

使用此流程成功获取令牌后。我在浏览器中清除了cookie,然后再次调用Oauth2令牌请求。

  http://localhost:8085/oauth/authorize?client_id=14366&redirect_uri=http://localhost:9999/ui/login&response_type=code&scope=read&

这将在重定向到登录页面之前再次在Redis中创建会话。现在,用户提供了凭据并提交,因为达到了maxmimumsessions(1),这将引发错误(服务器身份验证失败),但是redis中的会话仍然存在。它具有以下内容

sessionAttr:SPRING_SECURITY_SAVED_REQUEST : http://localhost:8085/oauth/authorize?client_id=14366&redirect_uri=http://localhost:9999/ui/login&response_type=code&scope=read&
maxInactiveTimeInterval
lastAccessedTime

我的问题是如何删除此会话?

编辑1:我已经设置了自定义autheniticationFailureHandler,如下所示,其中我调用了httpSession.invalidate();。但是我仍然看到会话是redis。

 public AuthenticationFailureHandler getAuthenticationFailureHandler() {
    AuthenticationFailureHandler handler =
        new SimpleUrlAuthenticationFailureHandler("/login?error") {

          @Override
          public void onAuthenticationFailure(
              HttpServletRequest request,
              HttpServletResponse response,
              AuthenticationException exception)
              throws IOException, ServletException {
            request.getSession().invalidate();
            if (isUseForward()) {
              logger.debug("Forwarding to " + "/login?error");

              request.getRequestDispatcher("/login?error").forward(request, response);
            } else {
              logger.debug("Redirecting to " + "/login?error");
              getRedirectStrategy().sendRedirect(request, response, "/loginoauth?error");
            }
          }
        };

    return handler;
  }

0 个答案:

没有答案