2009-05-27 67 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 

} 
相關問題