Spring Security - страницы Publi c, перенаправленные для входа в систему с неверным идентификатором сеанса - PullRequest
0 голосов
/ 19 апреля 2020

Я столкнулся с проблемой, из-за которой публичные c URL-адреса не будут работать в безопасности Spring, когда у вас уже есть SessionID, который больше не действителен.

Пример:
У меня есть пользователь- зарегистрируйте страницу и дайте ей разрешение. Все права доступа таковы:

http.authorizeRequests().antMatchers("/register**").permitAll();
http.authorizeRequests().anyRequest().authenticated();
http.formLogin().loginPage("/login").permitAll();

Для моих настроек сеанса у меня есть:

http.sessionManagement().invalidSessionUrl("/login?logoutcause=sessiontimeout");
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
http.sessionManagement().sessionAuthenticationErrorUrl("/login");
http.sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);
http.sessionManagement().sessionFixation().newSession();

Если у меня есть sessionID из предыдущего сеанса, который Возможно, это старый и недействительный файл, и я нажимаю «Маршрут» / / register », Spring жалуется на недопустимый идентификатор сеанса и перенаправляет меня на« /login".
. Просто упомяну это: все остальное, например, вход в систему, управление ресурсами Защищенные URL и выход из системы работают, как и ожидалось, с конфигурацией.

Воспроизведение этого: Использование управления Redis-Session в Spring. Нужно зайти на страницу входа, flu sh redis db с консоли. Доступ к странице регистрации напрямую в браузере -> перенаправление на страницу входа из-за неверного идентификатора сеанса.

o.s.s.w.s.SessionManagementFilter        : Requested session ID 8ad2e166-bc21-4646-8390-ad8d1043baec is invalid.
w.s.SimpleRedirectInvalidSessionStrategy : Starting new session (if required) and redirecting to '/login?logoutcause=sessiontimeout'
o.s.s.w.DefaultRedirectStrategy          : Redirecting to '/login?logoutcause=sessiontimeout'

Почему Spring даже проверяет идентификатор сеанса для маршрута, который имеет доступ "publi c"?

Следующий шаг: если я полностью отключил любые проверки безопасности на самом маршруте, к сожалению, необходимые ресурсы, такие как js и css, активируют такое же поведение, и либо меня перенаправляют на вход в систему, либо ресурсы просто делают не доставляется (оба варианта отсутствуют: D)

@Override
public void configure(WebSecurity web) throws Exception {
  web.ignoring().antMatchers("/register/**");
  super.configure(web);
}

Мое решение и обходной путь

Я отключил следующий конфиг, который решил все мои проблемы

// DISABLED
// http.sessionManagement().invalidSessionUrl("/login?logoutcause=sessiontimeout"); 

Мой вопрос

Это не самый лучший способ сделать это, верно? Каков лучший и более безопасный способ сделать это. Пожалуйста, помогите мне понять, почему к весне это делается или что я настроил неправильно.

...