登录后更新用户的lastLogin属性

时间:2011-03-13 18:52:25

标签: security spring grails groovy login

我的用户域有一个名为'lastLogin'的字段,我想在登录后更新(self-exaplantoy)。 重新启动tomcat(dev env)后,我得到以下异常:

groovy.lang.MissingMethodException:没有方法签名:static photoo.user.User.findById()适用于参数类型:(java.lang.Long)values:[2]可能的解决方案:findAll( groovy.lang.Closure),find(groovy.lang.Closure)

我在Config.groovy中使用以下代码:

// callback event, after a successful login
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
    def user = User.findById(appCtx.springSecurityService.principal.id)
    User.withTransaction {
        if(!user.isAttached())
            user.attach()
        user.lastLogin = new Date()
        user.save(flush: true)
    }
}

如何避免异常,为什么会发生? THX

2 个答案:

答案 0 :(得分:3)

最后我发现了这个错误。在withTransaction-block中加载用户是解决方案。

// dont load before
// def user = User.findById(appCtx.springSecurityService.principal.id)
User.withTransaction {
        def user = User.findById(appCtx.springSecurityService.principal.id)
        if(!user.isAttached())
            user.attach()
        user.lastLogin = new Date()
        user.save(flush: true, failOnError: true)
    }

答案 1 :(得分:1)

您可能只需要使用User.get()。这就是我所拥有的:

onInteractiveAuthenticationSuccessEvent = { e, appCtx ->

    // handle AuthenticationSuccessEvent
    def autservice = appCtx.authenticateService
    def user = autservice.userDomain()
    println "user: ${user.id}:${user}}"
    def request = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest()
    def session = request.getSession(false)
    if (user) {

        def person = Person.get(user.id)

        def lang = person.preferredLanguage
        if (session) {
            session.lang = lang
        }
    }
}
相关问题