2009-05-27 68 views
3

我在使用Grails编写一个Web应用程序中的Acegi/Spring Security的插件,和我有麻烦得到它看到的变化我做给用户实例。我只一直在使用Groovy/Grails的约三个星期,所以请原谅我,如果这个问题是微不足道的,因为我一直在研读了邮件列表和教程试图找到答案。的Acegi/Spring Security的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 

新的信息有时显示了我注销后再次,但通常没有,经常即使在三次或更多次重新记录之后也没有显示出来。另外,我尝试在person.save()中添加“flush:true”,但没有任何效果。

(外设的问题:这是对我不好与用户类像这样被摆弄如果没有,什么是将信息添加到它的最佳方式?)更多调查后

更新: 它看起来像是在普通页面中使用了loggedInUserInfo(),它工作正常,但如果我在布局中使用它,它会展现我描述的行为。难道会有一些奇怪的缓存吗?

回答

2

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

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

干杯,

2

你运行修改用户下课后的Grails生成经理?

+0

不,我没有,也不知道我需要。谢谢! 我不能在星期一进行测试,所以我要等上几天才能说出是否是解决方案。 – 2009-05-30 19:26:34

+0

3个月前我都不知道。但在http://www.infoq.com/articles/grails-acegi-integration上,我在评论中找到了答案:“我如何向AuthUser/User添加新字段?为什么有两种类型的用户?” 这解决了我的问题。 – 2009-05-31 05:58:32

+0

对不起,但那不能解决它。问题依然存在。尽管如此,感谢您的链接。 我怀疑它与会话中缓存的数据有关,但我不确定。 – 2009-06-02 19:42:36

1

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

您可以找到UserController#update封闭内后者。

1

我面临同样的问题,并遵循上面的Maximilian Schweitzer给出的建议。它在一开始并不适合我。

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

  1. 我的马克西米利安施韦策跑生成经理按照上面的回答。
  2. 试过之前,我跑了生成经理创建的用户登录 - 没有工作
  3. 我创建新用户(使用新UserController中,GSP等)
  4. 试图用新的用户登录工作得很好。
  5. 删除之前创建的旧用户并重新创建它们。它运行良好。

虽然不知道它是否适用于您的情况。

HTH!

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 

现在瞧!这是工作!

Luis

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 

} 
相关问题