java - Spring Security - 公共页面重定向到使用无效会话 ID 登录
问题描述
当您已经有一个不再有效的 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");
我的问题
这不可能是最好的方法,对吧?有什么更好,更安全的方法来做到这一点。请帮助我理解为什么春天会这样做,或者我配置错误的方式。
解决方案
我通过添加以下配置解决了同样的问题:
.antMatchers("/login-invalid").permitAll()
推荐阅读
- android - mergeDebugResources(strings.xml 中的字符串数组)
- python - 是否有一个 Python 函数可以在 R 中执行 mapply 的操作
- wordpress - 管理页面 woocommerce 中的自定义标签
- filter - 查询 Google Sheet Mailing List 的条件独特案例
- android-studio - 不幸的是,离子应用程序在真正的安卓设备上停止了
- perl - 从 Perl 授权 Spotify API
- javascript - 如何使用 Laravel Mix 向 VueJS 添加预渲染?
- c# - 如何获取子文件夹的名称(名称会有所不同),我需要将其传递到硬编码路径中以运行 File.Exists
- asp.net - 有没有办法用HttpClient获取api输入参数?
- javascript - 在 react-native 中无错误导航之前更改状态