我在Grails应用程序中使用了Acegi(AKA Spring Security)插件。在SecurityConfig.groovy
我添加了一行
userName = 'email'
使电子邮件字段用作用户名。我发现如果我更改电子邮件字段并保存对象,例如
user.email = 'my_new_email@foo.com'
user.save(failOnError: true)
保存完成且没有错误,但电子邮件字段实际上未更新。我的猜测是Acegi插件禁止更改用户名字段,但如果有人能确认,我将不胜感激。
谢谢, 唐
答案 0 :(得分:3)
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的来源以查看所有这些真值的含义!)
答案 1 :(得分:1)
您可以这样做:
String oldUsername = user.username
user.username='my@newusername.com'
user.save()
if(oldUsername != user.username) {
SpringSecurityUtils.reauthenticate(user.username, null)
}