Spring Security Максимальное время ожидания сеанса не работает - PullRequest
0 голосов
/ 19 сентября 2019

У нас есть

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);
...