Я реализую поток кода авторизации 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;
}