我正在使用Acegi / Spring Security插件在Grails中编写一个Web应用程序,但我无法看到我对User实例所做的更改。我只与Groovy / Grails合作了大约三个星期,所以如果这个问题很简单,请原谅我,因为我一直在研究邮件列表和教程,试图找到答案。
每当我需要用户包含更多信息(如电子邮件确认令牌或真实姓名)时,我一直在向User域类添加新属性,因为我找不到任何相反的建议。一切似乎都适合创建新用户,但是当我编辑用户时,更改会显示在用户列表中,但Acegi标记库和相关函数似乎看不到更改。
以下是UserController.update()的相关摘录:
def person = User.get(params.id)
//...snip error checking...
//Update user attributes
person.username = params.email
person.email = params.email
person.userRealName = params.userRealName
//Attempt to save changes
if (person.save()) {
//If successful, redirect back to profile viewing page
redirect action: show, id: person.id
return
}
else {
//Otherwise, show errors and edit again
render view: 'edit', model: buildPersonModel(person)
return
}
此代码运行后,如果我总是通过ID获取用户数据,我可以看到更改,但如果我使用Acegi标签或函数则不会。例如,这不起作用:
loggedInUserInfo(field:'realName')
但这样做:
User.get(loggedInUserInfo(field:'id').toLong()).realName
新的信息有时会在我退出后重新出现,但通常不会出现,即使在三次或更多次重新登录后也常常无法显示。另外,我尝试将“flush:true”添加到person.save(),但没有效果。
(外围问题:对我来说,像这样摆弄用户类是不是很糟糕?如果没有,那么向它添加信息的最佳方式是什么?)
经过更多调查后更新: 看起来如果我在普通页面中使用loggedInUserInfo(),它工作正常,但如果我在布局中使用它,它会展示我描述的行为。可能会有一些奇怪的缓存事情发生吗?
答案 0 :(得分:2)
修改用户类后是否运行了grails generate-manager?
答案 1 :(得分:2)
我有解决此问题的方法,我还为此问题创建了一个JIRA条目。
Acegi如何在内部更新其用户似乎存在一个错误。我以grails过滤器的形式提供了一种解决方法,每次访问控制器时都会手动更新用户的权限。不理想,但它的工作原理。
干杯,
答案 2 :(得分:1)
Acegi缓存用户信息,如果我没记错的话。检查“DefaultSecurityConfig
”文件(我认为这是名称,在config /下),用于禁用用户信息缓存。你也可以在authenticateService上调用一些方法(现在不记得用什么方法)来驱逐用户缓存。
您可以在UserController#update
关闭中找到后者。
答案 3 :(得分:1)
我遇到了同样的问题,并遵循Maximilian Schweitzer给出的建议。一开始它对我不起作用。
尝试这些步骤,看看它是否解决了问题:
虽然不确定它是否适用于您的情况。
HTH!
答案 4 :(得分:1)
我遇到了同样的问题。我的解决方案是将acegi插件更新到0.5.1版本(acegi 0.5.1 - Grails Spring Security 2.0插件)。
然后我设置为 /plugins/acegi-0.5.1/grails-app/conf/DefaultSecurityConfig.groovy
cacheUsers = false
现在瞧!它正在运作!
路易斯
答案 5 :(得分:0)
您必须重置经过身份验证的用户。下面的代码就是这样(来自this blog)。
import org.springframework.security.context.SecurityContextHolder
import org.springframework.security.providers.UsernamePasswordAuthenticationToken
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserImpl
import org.springframework.security.GrantedAuthority
import org.springframework.security.GrantedAuthorityImpl
...
def refreshAuthenticatedUser(user) {
GrantedAuthority[] auths = user.authorities.collect {
new GrantedAuthorityImpl(it.authority)
}
def grailsUser = new GrailsUserImpl(
user.username,
"",
user.enabled,
true,
true,
true,
auths,
user)
def authToken = new UsernamePasswordAuthenticationToken(grailsUser, '', auths)
SecurityContextHolder.context.authentication = authToken
}