Grails“记得我”不工作

时间:2014-01-04 18:15:50

标签: spring grails spring-security

我正在使用Grails Spring Security Plugin 2.0 RC2

当我通过在登录表单中添加复选框启用(开箱即用的)功能时。

正确创建cookie(提前2周),但在两种情况下,Remember-me机制不起作用:

  • 当我关闭浏览器时,记住我的cookie消失。为什么?
  • 当我删除JSESSIONID cookie时,会话不会重新生成。

另外:我不想使用持久性记住我需要在db中存储令牌。我想依靠基于cookie的记住我的策略。

2 个答案:

答案 0 :(得分:2)

这困扰了我一整天,但我使用的是Spring Security Plugin 1.2.7.3。

对我而言,配置中缺少身份验证提供程序。例如:

grails.plugins.springsecurity.providerNames = [
      'rememberMeAuthenticationProvider',
      'daoAuthenticationProvider',
      'ldapAuthProvider',
      'anonymousAuthenticationProvider']
'rememberMeAuthenticationProvider'是缺失的链接。我在设置日志级别时会发现这一点,以跟踪与我正在做的事情相关的所有事情:

trace 'org.springframework.security.web.authentication.rememberme',
      'org.springframework.security.web.authentication',
      'org.springframework.security.web',
      'org.springframework.security'

我在输出中看到了这一点(注意粗体):

  

2014-01-21 13:10:59,490 [http-bio-8080-exec-3] DEBUG   rememberme.TokenBasedRememberMeServices - 记住我记住的cookie

     

2014-01-21 13:10:59,545 [http-bio-8080-exec-3] DEBUG   rememberme.TokenBasedRememberMeServices - 记住我接受的cookie

     

2014-01-21 13:10:59,582 [http-bio-8080-exec-3] DEBUG   rememberme.RememberMeAuthenticationFilter - SecurityContextHolder没有   由AuthenticationManager拒绝,填充了remember-me令牌   RememberMeServices返回的身份验证:   “org.springframework.security.authentication.RememberMeAuthenticationToken@7651888e:   主要:   org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser@d008d6e3:    使记住我的令牌无效

     

消息:找不到org.springframework.security.authentication.RememberMeAuthenticationToken

的AuthenticationProvider      

2014-01-21 13:10:59,638 [http-bio-8080-exec-3] DEBUG   rememberme.TokenBasedRememberMeServices - 交互式登录尝试   没成功。

     

2014-01-21 13:10:59,638 [http-bio-8080-exec-3] DEBUG   rememberme.TokenBasedRememberMeServices - 取消cookie

作为fyi,删除JSESSIONID cookie与关闭浏览器基本相同:http://muras.eu/index.html%3Fp=673.html

希望有所帮助!

答案 1 :(得分:0)

让我感到困惑的是,我还为某些登录安装了Spring Security Open ID插件。除非您使用持久性SpringSecurityOpenidGrailsPlugin,否则会将记住我的功能更改为rememberMe文件中的无操作:

if (!conf.rememberMe.persistent) {
    // auth is external, so no password, so regular cookie isn't possible
    rememberMeServices(NullLogoutHandlerRememberMeServices)
}

如果您在GrailsRememberMeAuthenticationFilter中进行调试并看到注入的rememberMeServices对象是NullLogoutHanderlRememberMeServices对象,那么您就知道发生了什么。该版本将所有操作都视为无操作。

您希望内存中TokenBasedRememberMeServices或持久PersistentTokenBasedRememberMeServices能够实际运行。