使用spring security的grails中的最后登录日期
当我试图在使用spring security的grails中的最后登录日期,grails,spring-security,grails-plugin,Grails,Spring Security,Grails Plugin,当我试图在Config.groovy中使用事件侦听器设置lastLogin日期时,遇到了这个错误: 2011-05-12 00:30:16501[“ajp-bio-8009”-exec-6]错误 events.PatchedDefaultFlushEventListener-无法同步 会话为org.hibernate.StaleObjectStateException的数据库状态: 行被另一个事务(或未保存的值)更新或删除 映射不正确):[spl.User#110] 我的代码: grails.p
Config.groovy
中使用事件侦听器设置lastLogin
日期时,遇到了这个错误:
2011-05-12 00:30:16501[“ajp-bio-8009”-exec-6]错误
events.PatchedDefaultFlushEventListener-无法同步
会话为org.hibernate.StaleObjectStateException的数据库状态:
行被另一个事务(或未保存的值)更新或删除
映射不正确):[spl.User#110]
我的代码:
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
User.withTransaction {
def user = appCtx.springSecurityService.currentUser
user.lastLogin = new Date()
user.save(flush: true)
}
}
我似乎无法在我的测试环境中复制它,但有一次我在生产环境中尝试了它,我看到了这个错误并决定恢复。将“保存”更改为“合并”会解决此问题吗
编辑:我可以通过同时以同一用户身份登录,在测试环境中复制错误。为了进一步调试,我在事件处理程序中添加了一些print语句,并开始使用它。事实证明,当我或任何人登录到我的站点时,事件处理程序会被多次调用,从而导致陈旧的对象异常。为什么在登录时会多次调用onInteractiveAuthenticationSuccessEvent?
谢谢,
Ricardo您首先需要在会话中获取用户的新副本:
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
User.withTransaction {
def user = User.get(appCtx.springSecurityService.currentUser.id)
user.lastLogin = new Date()
user.save(flush: true)
}
}
我会调查-在登录期间可以写入哪些其他用户字段(可能是一些后台工作?),因此我能够通过同时与同一用户登录,在测试环境中复制失败。我尝试了您的修复程序以获取用户的新副本,但它仍然抛出异常。