我在Grails应用中使用了Acegi(又名Spring Security)插件。在SecurityConfig.groovy中,我添加了这一行

userName = 'email'

以便将电子邮件字段用作用户名。我发现如果我更改电子邮件字段并保存对象,例如
user.email = '[email protected]'
user.save(failOnError: true)

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

谢谢,

最佳答案

acegi使用的域对象被缓存。碰巧的是,我在本周和昨天在wrote up the solution遇到了同样的问题!

总之,您有两个选择:

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

通过在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的来源以查看所有这些真实值的含义!)

关于grails - Grails Acegi:更新用户名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2420249/

10-11 22:28