Я столкнулся с проблемой, из-за которой публичные 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");
Мой вопрос
Это не самый лучший способ сделать это, верно? Каков лучший и более безопасный способ сделать это. Пожалуйста, помогите мне понять, почему к весне это делается или что я настроил неправильно.