2012-08-10 48 views
1

我正在使用Spring安全性進行身份驗證的Spring + struts2 + hibernate集成。這裏是application-security.xml文件:如何在會話中存儲userId,以便下一個資源能夠在Spring安全中訪問它

<http> 
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/**" filters="none" /> 
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/> 
    <logout logout-success-url="/logged_out.jsp" /> 
</http> 

的問題是,當用戶通過認證,並請求被轉發到/homePage.action,我沒能獲得在homePage.action類(在Struts Action類)userid

下面是代碼:

UserDetails userDetails = (UserDetails) 
    SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

調試的代碼,結果發現,當請求被轉發到/homePage.actionSecurityContextHolder值被清除。

有沒有什麼辦法可以讓可用於homepage.action類?

我搜查了很多,但無法定稿。似乎我必須編寫一些自定義篩選器實現並掛鉤到Spring安全篩選器鏈中(以便會話管理僅在spring級別完成)。

任何人都可以給一些指針嗎?

+0

我想,如果用戶已經正確地驗證SecurityContextHolder的值不應被清除的是彈簧過濾鏈也得到應用。所有網址的filters =「none」? – 2012-08-10 14:12:25

+0

SecurityContextHolder在用戶驗證成功後確實持有UserDeatails。所有URL的filters =「none」都會導致spring security被繞過,因此我們無法調用任何與安全相關的方法。 – Atul 2012-08-11 09:28:33

+0

您應該在您的問題中澄清爲什麼您需要登錄表單而不是完全不安全的應用程序。此外,該配置會繞過登錄提交URL。你真的可以登錄嗎?當你提交登錄表單時,你沒有得到404嗎? – 2012-08-19 15:32:48

回答

0

有你要考慮幾件事情:

首先,你必須從最小到最大有你的過濾器。因爲如果有一個過濾器與請求匹配,則其餘過濾器將被忽略。 看到的問題在配置

,如果認證成功完成,SecurityContextHolder切切實實將包含當前用戶的UserDetails所以有可能是與認證

一個問題,有沒有這樣的事情在UserDetailsuserId財產。 (我假設你的意思不是username)所以如果你想要他的身份證,你是否必須擁有自己的職業,其範圍擴展爲UserDetails並且將userId財產置於其中,或者在USER表中查找(使用UserDetails.getUsername)並檢索他的ID。

+0

這實際上並不正確。在Spring Security 3.0中,在'intercept-url'設置中使用'filters =「none」'獨立於訪問約束,所以順序無關緊要。此外,無論用戶是否成功通過身份驗證,如果請求繞過安全鏈(如此處所示),SecurityContextHolder將不會包含任何內容。 – 2012-08-19 15:36:58

+0

嗨,我更改的application-security.xml看起來像這樣,以前是一個錯誤。 – Atul 2012-08-22 08:44:44

0

我更改了application-security.xml文件(下面給出), ,現在問題似乎得到解決。
主要變化是從

<intercept-url pattern="/**" filters="none" /> 

到:

<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" /> 


<http> 
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/inputUser.action" access="ROLE_ADMIN" /> 
    <intercept-url pattern="/getDeleteUsers.action" access="ROLE_ADMIN" /> 

    <intercept-url pattern="/login-fail.jsp" filters="none" /> 
    <intercept-url pattern="/logged_out.jsp" filters="none" /> 

    <intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" /> 
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/> 

    <logout logout-success-url="/logged_out.jsp"/> 
</http 

在彈簧安全,SecurityContextHolder通過SecurityContextPersistenceFilter填滿,因此它應該通過彈簧安全過濾器鏈。 (在Luke指出,filters="none"將不起作用)。

添加<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
確保當請求無二login-submissionhomePage.action

相關問題