使用Spring Security更改Grails中的上次登录日期

使用Spring Security更改Grails中的上次登录日期,grails,spring-security,Grails,Spring Security,在我的Config.groovy中,我使用了: grails.plugins.springsecurity.useSecurityEventListener = true grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx -> User.withTransaction { def user = User.findById(appCtx.spring

在我的
Config.groovy
中,我使用了:

grails.plugins.springsecurity.useSecurityEventListener = true

grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
    User.withTransaction {
        def user = User.findById(appCtx.springSecurityService.principal.id)
        if(!user.isAttached())
            user.attach()
        user.lastLoginDate = new Date()
        user.save(flush: true, failOnError: true)
    }
}
我的用户域有此字段,登录时我没有收到任何错误,但是,此字段未更新

我尝试了
org.hibernate
,但找不到任何
update
或其他相关语句

还有什么我需要添加的地方,以使这个工作

记录在案:

  • Grails1.3.7
  • Spring安全核心1.1.2
  • 休眠1.3.7

您使用的是哪个版本的spring security core??请看《春天安全》一书的作者给出的答案。。。。您是否需要升级spring安全版本

::更新::


如果你有和你一样的问题,希望你能通过调查得到解决方案…

好的,答案很简单。我忘记了包名,所以它找不到
用户

因此,如果您的
用户
对象位于包
org.test
中,则此方法有效:

org.test.User.withTransaction {
      def user = org.test.User.get(appCtx.springSecurityService.principal.id)
      user.lastLoginDate = new Date()
      user.save(failOnError: true)
}

我使用的是1.1.2,这个问题提到了v0.4.1在去年夏天修复这个问题。你能通过在顶部添加active=true来尝试吗?正如这里提到的:…我试过了,把所有东西都移到了
SecurityConfig.groovy
,但也没有运气。你不需要SecurityConfig.groovy,就像acegi插件(早期版本)一样,使用spring security core,你只能在Config.groovy里面做…所以你是说我可以在
Config.groovy
里面做,或者我必须在那里做?我知道你链接到的线程,这就是我最初获得代码的地方;)我使用的是Grails1.3.6和SSC1.1.2,代码与您的代码几乎完全相同,对我来说,它正在工作——因此我认为一定还有其他问题。例如,由于错误或类似原因,无法保存用户。。。你唯一不知道的是,我捕捉到了“OptimisticLockingFailureException”,然后做了一个User.merge(用户),但我怀疑这应该是你问题的原因。我能够解决它,实际上真的很愚蠢。见下面我的答案。一些无关的建议。一个是您可以删除附加逻辑-您正在事务中加载实例,因此它将始终被附加。您可以省略“flush:true”,因为事务总是刷新。也不要使用findById()-使用get()。@Burt非常感谢您的输入!