У нас есть
http.sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true)
и
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout-gimli-user")).permitAll()
.deleteCookies("JSESSIONID", "sessionid" /*, "sessdetail", "countfr"*/ );
и
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.invalidSessionUrl("/login?invalidSession") //dokunma
.maximumSessions(1) //dokunma
.maxSessionsPreventsLogin(true) //dokunma
.expiredUrl("/login?expired")
.sessionRegistry(sessionRegistry());
в
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
и в application.properties , у нас есть
server.servlet.session.timeout=3m
Когда пользователь пытается войти в систему, пользователь вводит пароль + имя пользователя , затем один раз код отправляется напользователь.После этого пользователь должен ввести этот код, а затем просматривать страницы.
Но если пользователь не вводит этот код, а только вводит имя пользователя + пароль и закрываетбраузер, выход из системы не работает.Потому что выход из системы не вызывается.
Но тайм-аут должен работать и убивать через 3 минуты.Или tomcat должен убить сеанс (потому что мы развертываем на внешний tomcat 9).
Я попробовал это https://stackoverflow.com/a/41450580/11369236
Я добавил
@Bean
public static ServletListenerRegistrationBean httpSessionEventPublisher() {
return new ServletListenerRegistrationBean(new HttpSessionEventPublisher());
}
, но все равно.
Я положил
List<SessionInformation> sessions = sessionRegistry.getAllSessions(authentication.getPrincipal(), false);
в
@Override
public Authentication authenticate(Authentication authentication) {
в открытый класс CustomAuthenticationProviderWithRoles реализует AuthenticationProvider {
и перепробовал множество входов в системубез одного временного кода подтвердите и увидите, что количество сеансов увеличивается.
Но когда я пытаюсь ввести один временной код, это не позволяет из-за maxSessionsPreventsLogin
, как здесь:
https://github.com/spring-projects/spring-security/issues/3078
Код страницы входа в систему:
<form method="POST" th:action="@{/login}">
<input autocomplete="off" class="form-control" id="mobile" name="username"
type="text">
<input autocomplete="off" class="form-control password" name="password"
type="password">
<button class="btn btn btn-block btn-primary btn-lg"
type="submit"
value="Log In">LOGIN
</button>
это для входа в систему:
http
.formLogin()
.loginPage("/login").permitAll()
и successhandler делает это для успешного входа в систему:
response.sendRedirect("/otp");
Затем он устанавливает секунды, на которые нужно рассчитывать для ввода кода.И отправляет другой вид для ввода кода, который содержит другую форму и кнопку отправки.
Что может быть наилучшей практикой?Например, пользователь может закрыть страницу после ввода пароля, но сессия все еще остается.Несмотря на то, что есть тайм-ауты.
Я могу использовать это, и это решает, но у меня уже есть тайм-аут сеанса в application.properties :
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response
request.getSession(false).setMaxInactiveInterval(11);