第四章. 信道安全
4.1. 概述
Acegi Security不僅能滿足你的認(rèn)證和授權(quán)的請(qǐng)求,而且能夠保證你的未認(rèn)證的web請(qǐng)求也能擁有某些屬性。這些屬性可能包括使用特定的傳輸類型,在HttpSession設(shè)置特定的屬性等等。Web請(qǐng)求的最普遍的需求是使用特定的傳輸協(xié)議,例如HTTPS。
在傳輸安全中的一個(gè)重要議題就是會(huì)話劫持(session hijacking)。Web容器通過一個(gè)jsessionid來引用一個(gè)HttpSession,這個(gè)jsessionid通過cookie 或者URL重寫轉(zhuǎn)向(URL rewriting)發(fā)送到到客戶端。如果jsessionid是通過HTTP發(fā)送的,那么就存在被劫持以及在認(rèn)證過程之后冒充被認(rèn)證用戶的可能。這是因 為大部分的web容器為特定的用戶維護(hù)同一個(gè)會(huì)話標(biāo)識(shí)符,即便是用戶從HTTP 切換到 HTTPS頁面。
如果對(duì)于你的特定應(yīng)用來說,會(huì)話劫持(session hijacking)是一個(gè)很嚴(yán)重的風(fēng)險(xiǎn),那么唯一的解決方法就是對(duì)每一個(gè)請(qǐng)求都使用HTTPS。這意味著jsessionid不會(huì)使用非安全信道傳輸。 你要保證你的web.xml中定義
4.2. 配置
啟用Acegi Security的信道安全服務(wù),需要在web.xml中增加如下行:
xml 代碼
- <filter>
- <filter-name>Acegi Channel Processing Filter</filter-name>
- <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
- <init-param>
- <param-name>targetClass</param-name>
- <param-value>org.acegisecurity.securechannel.ChannelProcessingFilter</param-value>
- </init-param>
- </filter><filter-mapping>
- <filter-name>Acegi Channel Processing Filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
和平時(shí)一樣,你同樣需要在application context中配置filter
java 代碼
- <bean id="channelProcessingFilter" class="org.acegisecurity.securechannel.ChannelProcessingFilter">
- <property name="channelDecisionManager"><ref bean="channelDecisionManager"/></property>
- <property name="filterInvocationDefinitionSource">
- <value>
- CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
- \A/secure/.*\Z=REQUIRES_SECURE_CHANNEL
- \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
- \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
- \A.*\Z=REQUIRES_INSECURE_CHANNEL
- </value>
- </property>
- </bean>
- <bean id="channelDecisionManager" class="org.acegisecurity.securechannel.ChannelDecisionManagerImpl">
- <property name="channelProcessors">
- <list>
- <ref bean="secureChannelProcessor"/>
- <ref bean="insecureChannelProcessor"/>
- </list>
- </property>
- </bean>
- <bean id="secureChannelProcessor" class="org.acegisecurity.securechannel.SecureChannelProcessor"/>
- <bean id="insecureChannelProcessor" class="org.acegisecurity.securechannel.InsecureChannelProcessor"/>
ChannelProcessingFilter和FilterSecurityInterceptor一樣支持Apache Ant style paths。
ChannelProcessingFilter的工作方式是過濾所有的web請(qǐng)求,并將判斷將適合的配置屬性應(yīng)用于其上。然后它代理到 ChannelDecisionManager。默認(rèn)的實(shí)現(xiàn)類ChannelDecisionManagerImpl應(yīng)該能夠滿足大多數(shù)需求。它就代理到 配置好的ChannelProcessor實(shí)例列表。ChannelProcessor會(huì)檢視請(qǐng)求,如果它不滿意請(qǐng)求(例如請(qǐng)求是發(fā)送自不正確的傳輸協(xié) 議)它將會(huì)重定向,拋出異常或者采取其他任何恰當(dāng)?shù)拇胧?/p>
Acegi Security 包括ChannelProcessor兩個(gè)實(shí)體類實(shí)現(xiàn):SecureChannelProcessor 保證配置了REQUIRES_SECURE_CHANNEL 屬性的請(qǐng)求都是從HTTPS發(fā)送過來的。而InsecureChannelProcessor 保證配置了REQUIRES_INSECURE_CHANNEL 屬性的請(qǐng)求都是從HTTP發(fā)送過來的。如果沒有使用請(qǐng)求的協(xié)議,這兩個(gè)實(shí)現(xiàn)都會(huì)轉(zhuǎn)到ChannelEntryPoint,而兩個(gè) ChannelEntryPoint 實(shí)現(xiàn)所作的就是簡(jiǎn)單的把請(qǐng)求相應(yīng)按照HTTP 和 HTTPS重定向。
要注意重定向是絕對(duì)(例如http://www.company.com:8080/app/page) 而不是相對(duì)的(例如 /app/page)。在測(cè)試中發(fā)現(xiàn)Internet Explorer 6 Service Pack 1 有一個(gè)bug,因此如果在重定向的時(shí)候也改變使用的端口,它就不能正確響應(yīng)。對(duì)應(yīng)這個(gè)bug,在很多Acegi Security bean中都會(huì)使用的PortResolverImpl也使用絕對(duì)URL。請(qǐng)參閱PortResolverImpl的JavaDoc以獲取更多信息。
你要注意使用為了在登錄過程中保證用戶名和密碼的安全,要使用安全信道。如果你配合基于表單的登錄使用 ChannelProcessingFilter,請(qǐng)記得一定要把你的登錄頁面設(shè)置為REQUIRES_SECURE_CHANNEL,并且 AuthenticationProcessingFilterEntryPoint.forceHttps屬性設(shè)置為true。
4.3. 結(jié)論
一旦配置好了,使用安全信道是非常簡(jiǎn)單的。只要請(qǐng)求頁面,不用管使用什么協(xié)議(HTTP 或 HTTPS)或什么端口(80, 8080, 443, 8443等)。顯然你只要確定初始請(qǐng)求(獲取通過在web.xml 中的
你也可以在ChannelDecisionManagerImpl中增加自己的ChannelProcessor實(shí)現(xiàn)。例如,你可能通過"輸入圖片中的內(nèi)容"檢測(cè)到一個(gè)個(gè)人類用戶,然后在HttpSession中設(shè)置一個(gè)屬性。
要判斷一個(gè)安全檢查應(yīng)該是或者ChannelProcessor或是 AccessDecisionVoter 記得前者是設(shè)計(jì)用來處理認(rèn)證或者未認(rèn)證的請(qǐng)求,而后者是設(shè)計(jì)用來處理已認(rèn)證的請(qǐng)求。因此后者可以訪問已認(rèn)證的principal被授予的權(quán)限。
另外,ChannelProcessor檢測(cè)到問題后一般是引發(fā)一個(gè)HTTP/HTTPS重定向這樣他的請(qǐng)求可以被滿足,而 AccessDecisionVoter將則會(huì)跑出一個(gè)AccessDeniedException異常(取決于支配的 AccessDecisionManager)。
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】