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

slh*_*hck 5 grails spring-security

在我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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的用户域具有此字段,登录时不会出现任何错误,但该字段未更新.

我试过调试一切,org.hibernate但我找不到任何update或其他相关的陈述.

还有什么我需要添加到任何地方才能使这个工作?

作为记录:

  • Grails 1.3.7
  • Spring Security Core 1.1.2
  • Hibernate 1.3.7

slh*_*hck 5

好的,答案很简单.我忘了包名,所以找不到User.

如果您的User对象在包中,那么这个有效org.test:

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

  • 一些无关的建议.一种是你可以删除附加逻辑 - 你在事务中加载实例,所以它总是被附加.并且您可以省略'flush:true',因为事务总是刷新.也永远不要使用findById() - 使用get(). (3认同)