知識積累(七)——Acegi (version1.0.4)中文參考手冊——第四章 信道安全

 

第四章. 信道安全

4.1. 概述

Acegi Security不僅能滿足你的認證和授權的請求,而且能夠保證你的未認證的web請求也能擁有某些屬性。這些屬性可能包括使用特定的傳輸類型,在HttpSession設置特定的屬性等等。Web請求的最普遍的需求是使用特定的傳輸協議,例如HTTPS

在傳輸安全中的一個重要議題就是會話劫持(session hijacking)。Web容器通過一個jsessionid來引用一個HttpSession,這個jsessionid通過cookie 或者URL重寫轉向(URL rewriting)發送到到客戶端。如果jsessionid是通過HTTP發送的,那麼就存在被劫持以及在認證過程之後冒充被認證用戶的可能。這是因 爲大部分的web容器爲特定的用戶維護同一個會話標識符,即便是用戶從HTTP 切換到 HTTPS頁面。

如果對於你的特定應用來說,會話劫持(session hijacking)是一個很嚴重的風險,那麼唯一的解決方法就是對每一個請求都使用HTTPS。這意味着jsessionid不會使用非安全信道傳輸。 你要保證你的web.xml中定義,把它指向一個HTTPS位置,同時應用程序不把用戶指向一個HTTP位置。 Acegi Security提供一個解決方案幫助你實現後者。

4.2. 配置

啓用Acegi Security的信道安全服務,需要在web.xml中增加如下行:





ChannelProcessingFilter的工作方式是過濾所有的web請求,並將判斷將適合的配置屬性應用於其上。然後它代理到 ChannelDecisionManager。默認的實現類ChannelDecisionManagerImpl應該能夠滿足大多數需求。它就代理到配置好的ChannelProcessor實例列表。ChannelProcessor會檢視請求,如果它不滿意請求(例如請求是發送自不正確的傳輸協 議)它將會重定向,拋出異常或者採取其他任何恰當的措施。

Acegi Security 包括ChannelProcessor兩個實體類實現:SecureChannelProcessor 保證配置了REQUIRES_SECURE_CHANNEL 屬性的請求都是從HTTPS發送過來的。而InsecureChannelProcessor 保證配置了REQUIRES_INSECURE_CHANNEL 屬性的請求都是從HTTP發送過來的。如果沒有使用請求的協議,這兩個實現都會轉到ChannelEntryPoint,而兩個 ChannelEntryPoint 實現所作的就是簡單的把請求相應按照HTTP HTTPS重定向。

要注意重定向是絕對(例如http://www.company.com:8080/app/page) 而不是相對的(例如 /app/page)。在測試中發現Internet Explorer 6 Service Pack 1 有一個bug,因此如果在重定向的時候也改變使用的端口,它就不能正確響應。對應這個bug,在很多Acegi Security bean中都會使用的PortResolverImpl也使用絕對URL。請參閱PortResolverImplJavaDoc以獲取更多信息。

你要注意使用爲了在登錄過程中保證用戶名和密碼的安全,要使用安全信道。如果你配合基於表單的登錄使用 ChannelProcessingFilter,請記得一定要把你的登錄頁面設置爲REQUIRES_SECURE_CHANNEL,並且 AuthenticationProcessingFilterEntryPoint.forceHttps屬性設置爲true

4.3. 結論

一旦配置好了,使用安全信道是非常簡單的。只要請求頁面,不用管使用什麼協議(HTTP HTTPS)或什麼端口(80, 8080, 443, 8443等)。顯然你只要確定初始請求(獲取通過在web.xml 中的 或一個衆所周知的主頁URL),完成以後filter會執行你application context定義的重定向。

你也可以在ChannelDecisionManagerImpl中增加自己的ChannelProcessor實現。例如,你可能通過"輸入圖片中的內容"檢測到一個個人類用戶,然後在HttpSession中設置一個屬性。

要判斷一個安全檢查應該是或者ChannelProcessor或是 AccessDecisionVoter 記得前者是設計用來處理認證或者未認證的請求,而後者是設計用來處理已認證的請求。因此後者可以訪問已認證的principal被授予的權限。

另外,ChannelProcessor檢測到問題後一般是引發一個HTTP/HTTPS重定向這樣他的請求可以被滿足,而 AccessDecisionVoter將則會跑出一個AccessDeniedException異常(取決於支配的 AccessDecisionManager)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章