我在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/