如果浏览器中的应用程序中没有以前的JSESSIONID cookie,则springSecurityService.reauthenticate不起作用

时间:2012-06-21 00:08:45

标签: grails spring-security

这是一个奇怪的问题,但我可以100%重现它。

根据login automatically with Grails Spring Security,以编程方式登录用户的推荐方法是使用springSecurityService.reauthenticate(username),这在注册确认后用于Spring-Security-UI插件。

但我的应用程序有这种非常奇怪的行为,它似乎没有立即生效(我尝试重新定向到经过身份验证的页面),但前提是我的域上没有从该浏览器进行过任何登录尝试。注意我在我的代码和spring-security-ui'verify registration'中都看到了这种行为,它使用这种方法来记录用户。

澄清,如果我:

  1. 清除我的my.domain.com的JSESSIONID cookie(我的grails应用程序在这里运行,但我也可以在localhost上重现)
  2. 点击控制器进入用户ID,提交时应自动登录用户,然后将其重定向到需要登录的页面
  3. 我最终不在页面上,而是踢到登录屏幕(如果您尝试访问该页面而未经身份验证,则会发生这种情况)。注意URL上的jsessionid(当然它每次都会改变),我不把它放在那里。 https://my.domain.com/login/auth;jsessionid=B1C9A849E222476A9C9987923D439D13
  4. 请注意,它不会出现作为竞争条件,我在登录生效前重定向,就像我尝试手动转到经过身份验证的页面一样,它仍然失败。我刚刚没有登录。
  5. 注意在步骤2中按下控制器,或者任何其他控制器实际上确实立即给我一个JSESSIONID,其值不同于URL上的值。

    但是如果我:

    1. 确保我之前的登录尝试有一个JSESSIONID cookie ,成功与否 。确保我已退出。
    2. 从上面重复步骤2(对于任何用户,而不是第一次尝试的用户)
    3. 一切都按预期工作!我已成功登录并在需要身份验证的页面上。并且它将继续适用于任何未来的尝试,直到我再次清除该cookie。
    4. 我很困惑。不知怎的,我得到了冲突的JSESSIONID值。在调用springSecurityService.reauthenticate(用户名)之后但在调用redirect(... securepage ...)之前,是否需要执行其他操作。注意我确实使用了频道安全性,它在整个重定向中在http和https之间反弹 - 但我不确定这与只有先前有一次身份验证尝试的奇怪行为有关。

      注意 使用用户名和密码通过登录屏幕进行正常登录,第一次使用干净的Cookie。

1 个答案:

答案 0 :(得分:1)

对于遇到此问题的任何人来说,问题与此问题Tomcat, keep session when moving from HTTPS to HTTP直接相关,而不是与springSecurityService.reauthenticate有关。我的登录页面是https,这导致了一个'安全'的JSESSIONID cookie,但在重新认证之后,我引导用户访问的安全页面是http,并且会话不再存在。通过强制https通过渠道安全性解决所有用户“登录”的目标网页。