我正在实现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;
}