CAS最早是耶魯大學開發的(CAS2.0以前的版本),後來開源出來由JASIG來繼續開發(CAS2.0以後的版本)。所以,當妳準備那某壹片文章上手練習的時候請分清版本。個人建議還是閱讀JASIG官方文檔比較好。https://wiki.jasig.org/display/CASC
壹個完整的單點登陸方案分兩部分
CAS server
CAS server如何配置就不多說了,基本的步驟就是
1. 下載CAS server包
2. 配置Tomcat的Https訪問設置
3. 部署CAS server,其實就是將.war文件拷貝到Tomcat目錄下
4. 生成證書(可以買,也可以使用自簽名證書,或者幹脆就用http協議,那就不需要證書了)
5. 修改用戶訪問配置(CAS支持關系數據庫,LDAP等多種數據存儲)
CAS client
CAS client是部署在應用端的,因為通常單點登陸都會涉及到對已有系統的改造。所以,client端的侵入性就變的很重要。侵入性越小,越容易部署和測試。CAS框架的優點之壹就在於它的client端對應用系統的侵入性比較小。對於Java的Web項目來說,妳只需要在web.xml裏面添加壹個filter,拷貝CAS client的jar包到應用系統,然後改造登陸認證過程即可。如果CAS server用的是Https,那就還需要將證書導入到JVM的可信證書域中,通常是($JAVA_HOME/lib/security/cacerts)。
所有的壹切看著都挺簡單的,但實際部署中妳會遇到各式各樣的問題。有很多問題網上都有人解答,這裏我就記錄壹下我遇到的壹個沒找到答案的問題?
現象:
當妳配置完CAS server, 也部署了CAS client後。用https登陸CAS server也都沒問題時,而妳無論如何都無法在登陸後跳轉到妳期待的頁面。盡管壹切看起來都配置對了,證書也導了,https也配了,filter也加了。但是還是不停的拋CAS ticket validation expection, CAS server no response錯誤。
解決方案:
請檢查妳的client是否把4個filter都配置全了,並且順序要對。
<!-- CAS SSO -->
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://cas-server:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>gateway</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client-host:8080</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://cas-server:8443/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client-host:8080</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.AssertionThreadLocalFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/sso/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/sso/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/sso/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/sso/*</url-pattern>
</filter-mapping>
官方文檔特別說明這4個Filter是必須的
The correct order of the filters in web.xml is necessary:
AuthenticationFilter
TicketValidationFilter (whichever one is chosen)
HttpServletRequestWrapperFilter
AssertionThreadLocalFilter
這裏我要說明壹下為什麽這4個filter是必須要配的。
AuthenticationFilter的作用是用於攔截SSO登陸請求的,當妳提交的request符合SSO登陸規則,CAS client會通過這個filter將登陸請求轉向到CAS server的登陸界面。因為這是第壹步,所以它要在最上面。
TicketValidationFilter的作用是用於攔截登陸返回的跳轉請求的。當CAS server確認登陸用戶名密碼後,會返回壹個server ticket,這個ticket會由應用服務器上的CAS client再送回CAS server進行驗證,用於防止仿冒攻擊的。
HttpServletRequestWrapperFilter的目的是將CAS server返回的信息封裝到Http request裏面,這樣客戶端就可以用request.getRemoteUser()來獲取用戶名等信息了。
AssertionThreadLocalFilter的作用是用於前端程序(通常是前端腳本程序)訪問,因為這個時候妳無法通過request來獲取信息。
所以如果這4個filter不配置正確,就會報各種錯誤。
將想法付諸於實踐,借此來影響他人是壹個人存在的真正價值。