grails - Acegi/Spring Security Grails 插件看不到用户实例的更改

标签 grails spring-security

我正在使用 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/

相关文章:

grails - 如何在第一个组合框(g:select)的基础上填充第二个组合框(g:select)的值?

ajax - Grails通过ajax调用轮询服务器

java - Spring MVC 的 DelegatingFilterProxy 有什么意义?

java - 面临SpringBoot Security模块登录错误

grails - Spring Websocket插件返回值

grails - 我无法使用 Geb 和 spock 运行简单的 Grails 功能测试

java - OAuth2 全局方法安全性

grails - UrlEncodedSlash 被 HttpFirewall 阻止(Grails 3.3.0.RC1;Spring-security-core 3.2.0.M1)

angular - 无法使用 Spring Security 5 注销

java - Docker Swarm 上具有多线程的分布式 Java 应用程序