如果登录尝试中我的应用程序的浏览器中没有以前的 JSESSIONID cookie,则 springSecurityService.reauthenticate 不起作用
Posted
技术标签:
【中文标题】如果登录尝试中我的应用程序的浏览器中没有以前的 JSESSIONID cookie,则 springSecurityService.reauthenticate 不起作用【英文标题】:springSecurityService.reauthenticate doesn't work if there are no previous JSESSIONID cookie in the browser for my application from a login attempt 【发布时间】:2012-06-23 04:48:13 【问题描述】:这是一个奇怪的问题,但我可以 100% 地重现它。
根据login automatically with Grails Spring Security,推荐的以编程方式登录用户的方法是使用 springSecurityService.reauthenticate(username),这在注册确认后在 Spring-Security-UI 插件中使用。
但是我的应用程序有这种非常奇怪的行为,它似乎没有立即生效(我尝试在之后立即重定向到经过身份验证的页面),但前提是之前没有从该浏览器对我的域进行过登录尝试.请注意,我在我的代码和 spring-security-ui '验证注册'中都看到了这种行为,它使用这种方法来让用户登录。
澄清一下,如果我:
-
为 my.domain.com 清除我的 JSESSIONID cookie(我的 grails 应用程序在这里运行,但我也可以在 localhost 上重现)
点击控制器输入用户 ID,提交时应自动登录用户,然后将用户重定向到需要登录的页面
我最终没有出现在页面上,而是被踢到了登录屏幕(如果您尝试在未经身份验证的情况下访问该页面,就会发生这种情况)。请注意 URL 上的 jsessionid(当然每次都会更改),我没有把它放在那里。 https://my.domain.com/login/auth;jsessionid=B1C9A849E222476A9C9987923D439D13
请注意,它似乎不是我在登录生效之前重定向的竞争条件,就好像我尝试手动进入经过身份验证的页面一样,它仍然失败。我只是没有登录。
注意在第 2 步中点击控制器,或任何其他控制器实际上确实会立即给我一个 JSESSIONID,其值与 URL 上的值不同。
但是如果我:
-
确保我有一个 JSESSIONID cookie来自以前的登录尝试,无论成功与否。确保我已退出。
从上面重复第 2 步(对于任何用户,而不是第一次尝试的用户)
一切正常!我已成功登录并在需要身份验证的页面上。在我再次清除该 cookie 之前,它将继续为任何未来的尝试工作。
我很困惑。不知何故,我得到了冲突的 JSESSIONID 值。在我调用 springSecurityService.reauthenticate(username) 之后但在调用 redirect(...securepage...) 之前,我需要做其他事情吗?请注意,我确实使用了通道安全性,它会在整个重定向过程中在 http 和 https 之间反弹 - 但我不确定这与仅在之前进行过一次身份验证尝试时才工作的奇怪行为有何关系。
注意通过登录屏幕使用用户名和密码进行的正常登录首次使用干净的 cookie。
【问题讨论】:
【参考方案1】:对于遇到此问题的任何人,该问题与此问题 Tomcat, keep session when moving from HTTPS to HTTP 直接相关,而不是 springSecurityService.reauthenticate。我的登录页面是 https,这导致了一个“安全”的 JSESSIONID cookie,但是在重新认证后,我引导用户访问的安全页面是 http,并且会话不再存在。通过通道安全强制 https 到所有用户“登录”的目标页面来解决。
【讨论】:
以上是关于如果登录尝试中我的应用程序的浏览器中没有以前的 JSESSIONID cookie,则 springSecurityService.reauthenticate 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
带有 Angular 和 Express 的 CORS - 在 Postman 中工作,但不在浏览器中
CentOS中我装了个JDK1.7而且设置了环境变了,echo都可以出现我的设置 ,但是我java -version还是以前那个版本