天天看點

Spring Security 的ChannelProcessingFilter 使用https請求

7.4.6  確定一個安全的通道

字母“s”是Internet上最重要的字母。任何一個在Web上沖浪超過五分鐘的人都知道絕大多數Web頁面均與以“http://”打頭的URL相關聯。那是因為絕大多數Web頁面都通過HTTP協定被請求和發送。

對于絕大多數頁面來說,HTTP完全夠用,但是當有秘密資訊在Internet上四處傳輸時就不夠用了。通過HTTP發送的資訊很容易被無法無天的黑客截獲和讀取,并被用于他們的惡意計劃。

當資訊必須秘密地被發送時,字母“s”就開始起作用了。對于那些頁面,你會發現相應的URL以“https://”而不隻是“http://”開頭。對于HTTPS,資訊仍然使用HTTP發送,但是在另一個端口上發送,而且被加密,那樣的話,如果它們被攔截了,任何非預定的人都将無法讀取它們。

令人遺憾的是,HTTPS的問題是必須確定通過HTTPS傳送的頁面屬于指向該安全頁面的連結的編寫者。換句話說,對于一個要用加密的HTTPS保護的頁面來說,它必須使用一個以“https://”打頭的URL進行連結。沒有那個字母“s”,該頁面便将不加密地在HTTP上發送。

由于這個至關重要的“s”特别容易被遺漏,是以Spring Security提供了一種十分簡單的方式來確定某些頁面使用HTTPS進行傳送,而不管使用了哪種URL來連結到它們。如圖7.14所示,ChannelProcessingFilter是一種Spring Security過濾器,它攔截某一請求,檢視它是否需要被保護,如果是,就通過将該請求重新定向至原始請求URL的HTTPS格式來讓“s”起作用。

Spring Security 的ChannelProcessingFilter 使用https請求

(點選檢視大圖)圖7.14  ChannelProcessingFilter把HTTP請求重新定向為HTTPS

(以及反過來),為每一個請求確定适當的安全性。

我們已經像下面那樣,在roadrantz-security.xml檔案中,為RoadRantz應用程式配置了一個ChannelProcessingFilter:

Spring Security 的ChannelProcessingFilter 使用https請求

這裡的filterInvocationDefinitionSource屬性被配置來告訴ChannelProcessingFilter哪些頁面應該使用HTTPS進行保護,以及哪些不應該進行保護。它被配置為一個或者是多個被映射為将保護或不保護的URL模式。

但是在這些URL出現之前,我們必須為如何處理那些URL設定一些基本法則。第一行包含CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON,用于告訴Spring Security在與随後的URL模式進行比較之前,先标準化所有的URL。第二行包含PATTERN_TYPE_APACHE_ANT,那表明随後的URL模式都将使用Apache Ant樣式路徑進行呈現。

随後的每一行都将一個URL模式映射到它的安全要求上。在RoadRantz應用程式中,登入頁面必須被保護(那樣才沒人能夠截取使用者的密碼)。是以,/login.htm被映射到REQUIRES_SECURE_CHANNEL,表明它應該通過HTTPS進行發送。同樣,發送給處理登入的URL的資訊也必須被加密。正如讀者很快将會看到的那樣,Spring Security的AuthenticationProcessingFilter負責/j_acegi_security_check,是以這個URL模式也被設定為REQUIRES_SECURE_CHANNEL。

RoadRantz應用程式中的其他頁面都不要求加密,是以“/**”URL模式(在Ant路徑文法中,這表示所有URL)被設定為REQUIRES_INSECURE_CHANNEL,指定其他所有頁面必須通過平常的、非安全的HTTP發送。注意,這些頁面要求一個非安全的通道。那意味着如果這些頁面被通過HTTPS進行通路,那麼ChannelProcessingFilter将會把它們重新定向為通過HTTP進行發送。

繼續閱讀