Acegi / Spring Security Grails插件没有看到对User实例的更改

时间:2009-05-27 15:39:38

标签: grails spring-security

我正在使用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(),它工作正常,但如果我在布局中使用它,它会展示我描述的行为。可能会有一些奇怪的缓存事情发生吗?

6 个答案:

答案 0 :(得分:2)

修改用户类后是否运行了grails generate-manager?

答案 1 :(得分:2)

我有解决此问题的方法,我还为此问题创建了一个JIRA条目。

Acegi如何在内部更新其用户似乎存在一个错误。我以grails过滤器的形式提供了一种解决方法,每次访问控制器时都会手动更新用户的权限。不理想,但它的工作原理。

干杯,

答案 2 :(得分:1)

Acegi缓存用户信息,如果我没记错的话。检查“DefaultSecurityConfig”文件(我认为这是名称,在config /下),用于禁用用户信息缓存。你也可以在authenticateService上调用一些方法(现在不记得用什么方法)来驱逐用户缓存。

您可以在UserController#update关闭中找到后者。

答案 3 :(得分:1)

我遇到了同样的问题,并遵循Maximilian Schweitzer给出的建议。一开始它对我不起作用。

尝试这些步骤,看看它是否解决了问题:

  1. 我按照Maximilian Schweitzer的回答运行了生成经理。
  2. 尝试使用在运行generate-manager之前创建的用户登录 - 无法正常工作
  3. 我创建了新用户(使用新的UserController,gsp等)
  4. 尝试使用新用户登录工作正常。
  5. 删除之前创建并重新创建的旧用户。它运作良好。
  6. 虽然不确定它是否适用于您的情况。

    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

}