【问题标题】:Acegi/Spring Security Grails plug-in not seeing changes to a User instanceAcegi/Spring Security Grails 插件看不到用户实例的更改
【发布时间】:2010-10-29 07:47:00
【问题描述】:

我正在使用 Acegi/Spring Security 插件在 Grails 中编写一个 Web 应用程序,但无法让它查看我对用户实例所做的更改。我只使用 Groovy/Grails 大约三个星期,所以如果这个问题是微不足道的,请原谅我,因为我一直在研究邮件列表和教程试图找到答案。

每当我需要用户包含更多信息(例如电子邮件确认令牌或真实姓名)时,我一直在向用户域类添加新属性,因为我找不到任何相反的建议。创建新用户似乎一切正常,但是当我编辑用户时,更改会显示在用户列表中,但 Acegi 标记库和相关函数似乎没有看到更改。

这里是来自 UserController.update() 的相关 sn-p:

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(),它工作正常,但如果我在布局中使用它,它会表现出我描述的行为。会不会有一些奇怪的缓存发生了?

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

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

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

    干杯,

    【讨论】:

    • 感谢您的链接。你能提供一个如何编写这样一个过滤器的例子吗?我不再从事有问题的项目,但我相信其他人可以从中受益。
    • 确定。 grails 过滤器的指南在这里:grails.org/Filters 但简短的版本是您只需将该过滤器文件放在 grails-app/conf 目录中即可。干杯
    • +1 - 我在角色方面遇到了同样的问题,JIRA 中提供的解决方法过滤器解决了这个问题。
    【解决方案2】:

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

    【讨论】:

    • 不,我没有,也不知道我需要这样做。谢谢!我要到星期一才能测试这个,所以我要等几天才能说它是否是解决方案。
    • 大约 3 个月前我也不知道。但是在infoq.com/articles/grails-acegi-integration 上,我在评论“如何向 AuthUser / User 添加新字段?为什么有两种类型的用户?”中找到了答案。这解决了我的问题。
    • 对不起,但这并不能解决问题。问题仍然存在。不过,感谢您的链接。我怀疑这与会话中缓存的数据有关,但我不确定。
    • 那我就不知道了。抱歉,Miguel 的帖子听起来不错。
    【解决方案3】:

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

    您也许可以在 UserController#update 闭包中找到后者。

    【讨论】:

    • 抱歉,设置 cacheUsers=false 并没有解决问题。另外,我在 authenticateService 中找不到驱逐用户缓存的方法。
    【解决方案4】:

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

    试试这些步骤,看看能否解决问题:

    1. 我按照 Maximilian Schweitzer 的上述回答运行了 generate-manager。
    2. 尝试使用在我运行 generate-manager 之前创建的用户登录 - 无效
    3. 我创建了新用户(使用新的 UserController、gsp 等)
    4. 尝试使用新用户登录效果很好。
    5. 删除之前创建的旧用户并重新创建它们。效果很好。

    虽然不确定它是否适用于您的情况。

    HTH!

    【讨论】:

    • 如果我还没有对各种模型和控制器进行大量修改,我会尝试这个,但既然我有解决方法,我就让它撒谎。
    【解决方案5】:

    我也遇到了同样的问题。我的解决方案是将 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
    

    现在瞧!它正在工作!

    路易斯

    【讨论】:

      【解决方案6】:

      您必须重置经过身份验证的用户。下面的代码就是这样做的(来自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
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-06
        • 2014-03-08
        • 2011-09-06
        • 2011-09-18
        • 2016-05-24
        • 2011-01-26
        • 1970-01-01
        • 2013-09-06
        相关资源
        最近更新 更多