我正在使用 Acegi/Spring Security 插件在 Grails 中编写一个 Web 应用程序,但无法让它查看我对 User 实例所做的更改。我只使用 Groovy/Grails 大约三个星期,所以如果这个问题很微不足道,请原谅我,因为我一直在仔细研究邮件列表和教程,试图找到答案。
每当我需要用户包含更多信息(例如电子邮件确认 token 或真实姓名)时,我都会向用户域类添加新属性,因为我找不到任何相反的建议。创建新用户似乎一切都很好,但是当我编辑用户时,更改显示在用户列表中,但 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() 中,但没有效果。
(外围问题:像这样摆弄 User 类对我来说是不是很糟糕?如果不是,向其中添加信息的最佳方法是什么?)
更多调查后更新: 看起来如果我在普通页面中使用 LoggedInUserInfo() ,它工作得很好,但如果我在布局中使用它,它就会表现出我所描述的行为。会不会发生一些奇怪的缓存事情?
最佳答案
我有一个解决此问题的方法,并且我还创建了一个 JIRA问题的条目。
Acegi 在内部更新用户的方式似乎存在错误。我以 grails 过滤器的形式提供了一种解决方法,每次访问 Controller 时都会手动更新用户的权限。不理想但有效。
干杯,
关于grails - Acegi/Spring Security Grails 插件看不到用户实例的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916473/