Spring Security - 公共页面重定向到使用无效会话 ID 登录

Posted

技术标签:

【中文标题】Spring Security - 公共页面重定向到使用无效会话 ID 登录【英文标题】:Spring Security - Public pages redirected to login with invalid session id 【发布时间】:2020-08-01 19:23:45 【问题描述】:

我遇到了一个问题,当您已经拥有一个不再有效的 SessionID 时,公共 url 在 Spring 安全性中不起作用。

示例: 我有用户注册页面,并给了它一个 permitAll 访问权限,如下所示:

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,它可能是一个旧且无效的会话 ID,并且我点击了路由“/register”,spring 会抱怨无效的会话 ID 并将我重定向到“/login”。 顺便提一下:其他所有内容,例如登录、资源管理、受保护的 url 和注销,都在配置中按预期工作。

重现:在 Spring 中使用 Redis-Session 管理。进入登录页面,使用控制台刷新 redis db。直接在浏览器中访问注册页面->由于无效的会话ID而重定向到登录。

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 甚至会检查具有“公共”访问权限的路由的会话 ID?

下一步: 如果我完全禁用路由本身的任何安全检查,可悲的是,所需的资源(如 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"); 

我的问题

这不是最好的方法,对吧? 有什么更好和更安全的方法来做到这一点。 请帮助我理解为什么春天会这样做,或者我配置错误的方式。

【问题讨论】:

【参考方案1】:

我通过添加以下配置解决了同样的问题:

.antMatchers("/login-invalid").permitAll()

【讨论】:

以上是关于Spring Security - 公共页面重定向到使用无效会话 ID 登录的主要内容,如果未能解决你的问题,请参考以下文章

尽管我们不提供 Spring Security 配置,为啥 Spring Security 应用程序会重定向到登录页面?

Spring security自定义登录页面不重定向

Spring Security 3.1 - 发生会话超时时自动重定向到登录页面

Spring Security 禁用登录页面/重定向

由于重定向循环,Grails Spring Security 无法显示登录页面

Grails Spring Security - 登录后总是重定向到特定页面?