我正在使用 Acegi/Spring Security 插件在 Grails 中编写一个 Web 应用程序,并且无法让它查看我对用户实例所做的更改。我只使用 Groovy/Grails 大约三周,所以如果这个问题是微不足道的,请原谅我,因为我一直在研究邮件列表和教程试图找到答案。
每当我需要用户包含更多信息(例如电子邮件确认令牌或真实姓名)时,我一直在向用户域类添加新属性,因为我找不到任何相反的建议。创建新用户似乎一切都很好,但是当我编辑用户时,更改显示在用户列表中,但 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
新信息有时会在我注销并再次登录后出现,但通常不会出现,即使在 3 次或更多重新登录后通常也不会出现。另外,我尝试在 person.save() 中添加“flush:true”,但没有任何效果。
(外围问题:像这样摆弄 User 类对我来说是不是很糟糕?如果不是,向其中添加信息的最佳方法是什么?)
更多调查后更新: 看起来如果我在普通页面中使用 loggedInUserInfo(),它工作正常,但如果我在布局中使用它,它会表现出我描述的行为。会不会发生一些奇怪的缓存事情?