1

我在我的 Grails 应用程序中使用 Acegi (AKA Spring Security) 插件。在SecurityConfig.groovy我添加了这一行

userName = 'email'

以便将电子邮件字段用作用户名。我发现如果我更改电子邮件字段并保存对象,例如

user.email = 'my_new_email@foo.com'
user.save(failOnError: true)  

保存完成且没有错误,但电子邮件字段实际上并未更新。我的猜测是 Acegi 插件禁止更改用户名字段,但如果有人能确认,我将不胜感激。

谢谢,唐

4

2 回答 2

3

acegi 使用的域对象被缓存。巧合的是,我这周遇到了同样的问题,昨天写了解决方案!

总之,您有两个选择:

通过将 cacheUsers = false 添加到您的 SecurityConfig.groovy 来关闭域对象的缓存

通过在 SecurityContextHolder 中替换域对象来刷新域对象

private def refreshUserPrincipal(user) {
    GrantedAuthority[] auths = user.authorities.collect {
        new GrantedAuthorityImpl(it.authority)
    }
    def grailsUser = new GrailsUserImpl(
        user.username
            "",
            true,
            true,
            true,
            true,
            auths,
            user);
    def authToken = new UsernamePasswordAuthenticationToken(grailsUser, "", auths)
    SecurityContextHolder.context.authentication = authToken
}

(查看GrailsUserImpl的来源,了解所有这些真实值的含义!)

于 2010-03-11T08:55:23.457 回答
1

你可以简单地做:

String oldUsername = user.username
user.username='my@newusername.com'
user.save()
if(oldUsername != user.username) {
  SpringSecurityUtils.reauthenticate(user.username, null)
}
于 2012-06-27T11:55:54.607 回答