單點登錄系列之三---簡單實施SSO

默認時,爲了啓用Web SSO,開發者必須開啓HTTPS傳輸通道。由於傳回CASTGC Cookie到CAS服務器需要走HTTPS通道,因此開發者必須準備好X.509 CA證書。當然,您也可以選擇修改這一默認行爲,但從安全性的角度考慮,不推薦這樣做。


1.使用keytool生成根證書
1.1.查看jre信任的證書

(1)查看jre中所有信任的證書信息
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

(2)查看別名爲root的證書信息
keytool -v -list -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit


1.2.刪除jre中別名爲root的證書
keytool -delete -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

1.3.開始生成根證書
確認jre中不存在別名爲root的證書之後,我們開始生成根證書。
(1)生成密鑰庫文件root.keystore
keytool -genkey -keyalg RSA -alias root -dname " CN=localhost, OU=javaeeOU, O=javaee, L=GuangZhou, ST=GuangDong, C=CN" -storepass changeit -keystore root.keystore
使用默認密碼,直接回車。

(2)導出別名爲root的證書,證書名root.crt
keytool -export -alias root -file root.crt -storepass changeit -keystore root.keystore

(3)將證書導入到jre信任證書庫中
keytool -import -alias root -file root.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

(4)查看別名爲root的證書信息,確認成功導入到jre信任證書庫中
keytool -v -list -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit


2.啓用HTTPS
2.1.在Tomcat中啓用HTTPS配置

打開Tomcat目錄下的conf/server.xml文件,添加Connector代碼如下:

Html代碼 收藏代碼
  1. <span style="font-size: small;"><Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
  2. maxThreads="150" minSpareThreads="2" maxSpareThreads="10"
  3. scheme="https" secure="true"
  4. clientAuth="false" sslProtocol="TLS"
  5. keystoreFile="conf/root.keystore" keystorePass="changeit"
  6. truststoreFile="E:/DevelopTools/JDK/jdk1.5.0_10/jre/lib/security/cacerts" /></span>

其中:
keystoreFile指向密鑰庫文件root.keystore
keystorePass默認爲changeit
truststoreFile指向jre信任的證書庫文件

2.2.安裝證書
  啓動Tomcat,訪問地址:https://localhost:8443/cas3,瀏覽器將會返回證書錯誤界面:


單擊“繼續瀏覽此網站(不推薦)”鏈接,查看並將證書導入到瀏覽器中:


單擊“查看證書”,彈出證書安裝界面:


單擊“安裝證書”,進入證書導入嚮導界面:


選擇“受信任的根證書頒發機構”,接下來只需要一路選擇“下一步”或者“是”直至導入成功。

證書導入成功後,重新瀏覽器並訪問地址:https://localhost:8443/cas3,將會看到類似於下圖的鎖圖標,並可單擊該圖標查詢證書信息,這表示證書已安裝成功,正確啓用了HTTPS。



3.對Web應用實施SSO
Web應用採用Tomcat自帶的servlet例子Hello World,默認訪問路徑爲http://localhost:8080/examples/servlets/servlet/HelloWorldExample。在沒有對該servlet實施SSO之前,啓動Tomcat後訪問結果如下圖所示:


接下來,我們將對該servlet實施SSO,配置步驟如下:
3.1.添加Cas Client相應Jar包

只需要添加兩個Jar包:cas-client-core-3.1.10.jar、commons-logging-1.0.4.jar,將其拷貝到Tomcat安裝目錄下的webapps\examples\WEB-INF\lib目錄下。


3.2.配置web.xml文件

對於Cas Client在web.xml文件中的配置,主要包括兩個方面,一個是過濾器的配置,另一個是監聽器的配置。


3.2.1.過濾器配置

主要有以下5個過濾器:
1.SingleSignOutFilter
2.AuthenticationFilter
3.TicketValidationFilter (whichever one is chosen)
4.HttpServletRequestWrapperFilter
5.AssertionThreadLocalFilter
對於這5個過濾器,在web.xml中的配置必須嚴格按照以上順序進行聲明。
 其中,AuthenticationFilter、TicketValidationFilter是必須配置的,其他3個過濾器是可選的。特別的,如果配置了SingleSignOutFilter,必須配合SingleSignOutHttpSessionListener這一監聽器進行使用。

3.2.1.1.SingleSignOutFilter

該過濾器用於實現單點登出功能,可選配置。配置如下:

Xml代碼 收藏代碼
  1. <filter>
  2. <filter-name>CAS Single Sign Out Filter</filter-name>
  3. <filter-class>
  4. org.jasig.cas.client.session.SingleSignOutFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>CAS Single Sign Out Filter</filter-name>
  9. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  10. </filter-mapping>

3.2.1.2.AuthenticationFilter
該過濾器負責用戶的認證工作,必須啓用它。配置如下:

Xml代碼 收藏代碼
  1. <filter>
  2. <filter-name>CAS Authentication Filter</filter-name>
  3. <filter-class>
  4. org.jasig.cas.client.authentication.AuthenticationFilter
  5. </filter-class>
  6. <init-param>
  7. <param-name>casServerLoginUrl</param-name>
  8. <param-value>https://localhost:8443/cas3/login</param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>serverName</param-name>
  12. <param-value>localhost:8080</param-value>
  13. </init-param>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>CAS Authentication Filter</filter-name>
  17. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  18. </filter-mapping>

3.2.1.3.TicketValidationFilter
該過濾器負責對Ticket的校驗工作,必須啓用它。配置如下:

Xml代碼 收藏代碼
  1. <filter>
  2. <filter-name>CAS Validation Filter</filter-name>
  3. <filter-class>
  4. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
  5. </filter-class>
  6. <init-param>
  7. <param-name>casServerUrlPrefix</param-name>
  8. <param-value>https://localhost:8443/cas3</param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>serverName</param-name>
  12. <param-value>localhost:8080</param-value>
  13. </init-param>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>CAS Validation Filter</filter-name>
  17. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  18. </filter-mapping>

3.2.1.4.HttpServletRequestWrapperFilter
該過濾器負責實現HttpServletRequest請求的包裹,比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。配置如下:

Xml代碼 收藏代碼
  1. <filter>
  2. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  3. <filter-class>
  4. org.jasig.cas.client.util.HttpServletRequestWrapperFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  9. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  10. </filter-mapping>

3.2.1.5.AssertionThreadLocalFilter該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。比如AssertionHolder.getAssertion().getPrincipal().getName()。配置如下:

Xml代碼 收藏代碼
  1. <filter>
  2. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  3. <filter-class>
  4. org.jasig.cas.client.util.AssertionThreadLocalFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  9. <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
  10. </filter-mapping>


3.2.2.監聽器配置

當配置了SingleSignOutFilter過濾器,即對Web應用實施單點登出功能時,需要在web.xml中添加以下監聽器:

Xml代碼 收藏代碼
  1. <listener>
  2. <listener-class>
  3. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  4. </listener-class>
  5. </listener>

3.2.3.啓動應用
配置完成後,重新啓動Tomcat,並訪問地址http://localhost:8080/examples/servlets/servlet/HelloWorldExample,由於該servlet已受到Cas的保護,所以我們會被引導到Cas登錄頁面。
只有通過Cas認證,才能真正的訪問到http://localhost:8080/examples/servlets/servlet/HelloWorldExample這個servlet。

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