2010-05-30 130 views
1

此代碼獲取年代當前登錄的用戶,使用Spring安全插件(Acegi的):如何保存春季安全登錄的用戶在會話

def principalInfo = authenticateService.principal() 
def person = null 
if (principalInfo != "anonymousUser" && principalInfo.username) { 
    person = Person.findByUsername(principalInfo.username) 
} 

然後,我會喜歡做的事:

session.user = person 

這需要在用戶登錄後完成。我無法弄清楚在哪裏放置我的代碼來執行此操作。它似乎應該是登錄控制器中的某個地方,但我看不到在哪裏。

回答

1

你爲什麼要這樣做?該人已經隸屬於會議中的委託人。調用authenticateService.userDomain()來訪問它。

+0

幾乎工程,但如果你訪問任何相關財產如果失敗,例如如果我做 person = authenticateService.userDomain() company = person.company 我得到一個LazyInitializationException。可能這就是爲什麼人們使用上面的代碼? 這是我需要一個自定義的userDetailsS​​ervice?或者會設置渴望解決問題? – 2010-05-30 20:11:58

+0

您可以使用預先抓取,但如果您只需要它就可以使用這種用例。爲了避免LIE,您可以重新附加實例(def person = authenticateService.userDomain(); person.attach())或通過id(def person = Person.get(authenticateService.userDomain()。id))重新加載它。這比預先加載更好,因爲只有當你知道需要時才能做到這一點 - 如果你只需要字符串,布爾值或數字屬性,那麼就不需要重新附加或重新加載。 – 2010-05-31 03:37:42

+0

person.attach()給了我一個NonUniqueObjectException,但def person = Person.get(authenticateService.userDomain()。id)的作品。 謝謝! – 2010-05-31 07:14:09

0

Spring不會直接在會話中設置用戶對象。但是他們在會話中放置了SPRING_SECURITY_CONTEXT對象。這包含經過身份驗證的用戶。在你的控制器代碼

${session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated} 

或乾脆直接:

下在對子級的GSP工作。 我用這個與導航插件,顯示某些菜單的:

static navigation = [ 
     group:'tabs', 
     order:10, 
     isVisible: { session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated } 
    ] 

,並回答你的問題,你可以得到用戶對象是這樣的:

session.SPRING_SECURITY_CONTEXT?.authentication?.principal?