使用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
如果你有和你一样的问题,希望你能通过调查得到解决方案…好的,答案很简单。我忘记了包名,所以它找不到
用户
因此,如果您的用户
对象位于包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非常感谢您的输入!