利用Spring Security的Pre-Authentication完成多組認證

不知您是否想過,如果您有兩個以上的入口,然後又必須讓兩個認證都能通過認證。

想當然應該很多人都會抓著腦袋想半天,然後最後的結果是放棄。

其實,事實上如果您的Java Web系統最初的認證機制是經由Spring Security來實現的話,那麼恭喜您,Spring Security裡面已經含有Pre-Authentication預認證機制,您可以利用這項Pre-Authentication機制,來實現多認證的想法。

Spring Security起始是由 EntryPoint開始進入,因此您必須在設定檔內,指定或採用預設的設定:

<sec:http use-expressions="true" auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">

<sec:custom-filter position="PRE_AUTH_FILTER" ref="preAuthenticatedProcessingFilter" />
<sec:custom-filter position="FORM_LOGIN_FILTER" ref="usernamePasswordAuthenticationFilter"/>

</sec:http>

在EntryPoint內需要設定的是各種合適的 Filter。然後在Filter中至少設定

<property name="authenticationManager" ref="authenticationManager"/>

Manager主要是為了根據各種Filter,來取得各種對應的Privder,Privder裡面就可以設定相對應的UserDetailService。

Spring Security的Pre-Authentication機制也就是利用剛剛上述的各種Bean,來為您轉換或是取得相對應的認證物件。這些物件的產生完全遵照Spring的注入原則來產生的。

Filter會接受由Web Container所提供的java.security.Principal物件,來產生各種Authentication(真正實作是稱為Token),這些Authentication裡面會帶著java.security.Principal,以及其他相關的屬性(例如:是否通過認證…),這些Authentication之後會被Provider,以呼叫UserDetailService方式傳回相應的UserDetail後,重新包裝成另外一個Authentication。新的Authentication當然內容物也就被Privder更改過了,其中包含GrantedAuthority(身分)和另一個UserDetail物件。

藉由繼承適當的Filter、Provider、UserDetailServices將能達成封裝想要的UserDetail的目的,因此當然也就可以完成多組認證的機制。

不過有幾點是需要注意的:

1. 使用這樣的認證機制,最好使用Spring Security的login機制;在實際使用Realm的認證結果,不知道為什麼,總得在第二次的認證才能得到 Principal。這點許多人都認為是Spring Security的Bug。

2. 如果使用後發現Spring Security的Authentication並沒有順利地被產生,這將會使得Spring Security的taglib失效。您可以採用SecurityContextHolder.setContext(new SecurityContextImpl()); 方式自行產生。

3. 務必在web.xml 中設定Spring Security 的Filter,以攔截所有的request,並且這個Filter應該置為較優先執行。

參考資料:

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html

http://prasanthaboutjava.blogspot.com/2011/06/spring-security30x-authorisation-only.html

廣告

About fenjj

Perfect !!??...
本篇發表於 Uncategorized。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s