Grails:具有匿名访问权限的CookieTheftException

时间:2014-03-25 05:56:45

标签: session grails cookies

我有一个grails服务器和一个iOS客户端,通过POST消息通过HTTPS进行通信。我使用PersistentTokenBasedRememberMeServices确保用户不必一直输入密码。这似乎不起作用,因为会话不断丢失,用户必须再次登录。服务器日志显示发生了CookieTheftException,消息"无效的记住我令牌(系列/令牌)不匹配"。

并非所有服务器操作都需要登录用户。有些可以匿名访问,这可能是问题的根源。当用户访问受限制的服务器操作时,将维护会话,但在访问不受限制的操作时则不会。

这是我在Config.groovy中的配置:

grails.plugins.springsecurity.rememberMe.cookieName = 'SomeRememberMeName'
grails.plugins.springsecurity.rememberMe.persistent = true
grails.plugins.springsecurity.rememberMe.alwaysRemember = true
grails.plugins.springsecurity.rememberMe.persistentToken.domainClassName = 'com.myapp.PersistentLogin'
grails.plugins.springsecurity.rememberMe.tokenValiditySeconds=31*24*60*60

我在iOS客户端添加了一些痕迹,并注意到了一些事情。首先,JSESSIONID cookie没有到期时间,这意味着它不会像rememberMe cookie一样保存在客户端中。我可以强制它有一个到期时间或者这是一个好主意吗?其次我注意到有时我从服务器收到的rememberMe cookie是空的。这可能只是因为抛出了CookieTheftException。

由于所有的帖子邮件正文都是用256位AES加密的,所以我此时并不担心cookie被盗。我只需要让它发挥作用。

我尝试将以下内容添加到配置中,以确保即使访问不受限制的操作也会始终更新会话:

grails.plugins.springsecurity.useSessionFixationPrevention = true
grails.plugins.springsecurity.SessionFixationPrevention.migrate = true
grails.plugins.springsecurity.SessionFixationPrevention.alwaysCreateSession = true

我甚至都不知道这些意味着什么。我只是喜欢" alwaysCreateSession"部分并认为我需要启用会话固定防止,以使该设置产生任何影响。如果我将useSessionFixationPrevention设置为false,它是否仍会始终创建会话?

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果您使用PersistentTokenBasedRememberMeServices,则每次HTTP请求后,“记住我”令牌都会更改。

不幸的是,这意味着请求只会在您的浏览器一次只发出一个请求时进行身份验证,而浏览器通常不会这样做。如果页面上有4个图像,浏览器将同时发出4个请求,每个请求都有相同的“记住我”令牌。只有第一个请求才会进行身份验证,因为在Spring Security处理第一个请求后,它会更改令牌。当Spring Security尝试处理下一个请求时,它会抛出CookieTheftException

这是使用CookieTheftExceptionPersistentTokenBasedRememberMeServices的典型场景。

以下链接说明了您可以采取的一些措施:Grails Cookie Theft Exceptions

Grails Spring Security Core插件还存在一个未解决此问题的问题:Remember me functionality fails intermittently with CookieTheftException: Invalid remember-me token

JSESSIONID的东西可能是红鲱鱼。如果您使用的是PersistentTokenBasedRememberMeServices,则您的身份验证不需要会话。