使用cas實現(xiàn)sso |
CAS (Central Authentication Service)是Yale大學(xué)的ITS開發(fā)的一套JAVA實現(xiàn)的開源 的SSO(single sign-on)的服務(wù),http://www.yale.edu/tp/cas/ cas分為服務(wù)端和客戶端,在服務(wù)端開啟SSL,服務(wù)器下發(fā)證書安裝到各個客戶端中,客戶端在與服務(wù)器進(jìn)行通訊驗證時,將檢驗二者的證書是否一致。 1、服務(wù)器中生成證書:keytool -genkey -alias cnc -keystore c:\mykeystore 導(dǎo)出證書,由客戶端安裝: keytool -export -alias -keystore c:\mykeystore -file c:\mycerts.cer 注:生成證書時,CN要和服務(wù)器的域名相同,如果在本地測試,則使用localhost 2、客戶端配置:(注:使用client2.0.11版本穩(wěn)定些,2.0.10總報異常) 將服務(wù)器下發(fā)的證書導(dǎo)入到JVM中 keytool -import -trustcacerts -alias cnc -keystore $JAVA_HOME/JRE/LIB/SECURITY/CACERTS -file c:\mycert.cer (如果這樣不行,則到JAVA_HOME/JRE/LIB/SECURITY/下進(jìn)行) 配置web.xml: <filter> <filter-name>CASFilter</filter-name> <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <param-value>https://localhost:8443/cas/login</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> <param-value>https://localhost:8443/cas/proxyValidate</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <param-value>localhost</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 當(dāng)前CAS默認(rèn)的用戶名和密碼判斷是,只要用戶名和密碼相同即可。使用的類為SampleHandler,一般的是與數(shù)據(jù)庫進(jìn)行匹配,這樣我們可以實現(xiàn)PasswordHandler接口, 在authenticate()方法中進(jìn)行驗證??梢栽谌萜髦信渲脭?shù)據(jù)源,使用容器提供的數(shù)據(jù)源。 同時修改服務(wù)器下CAS的web.xml中的配置,使用自己的類。 <context-param> 然后重新BUILD,將類打包,替換服務(wù)器CAS/WEB-INF/LIB下原來的包。 CAS只能提供SSO,對于角色,授權(quán),則要在web.xml進(jìn)行相應(yīng)的配置<security-constraint>,也可以使用filter。 常出現(xiàn)的異常:“未找到可信任的證書”--主要原因為在客戶端未將服務(wù)器下發(fā)的證書導(dǎo)入到JVM中,可以用keytool -list -alias cnc -keystore $JAVA_HOME/JRE/LIB/SECURITY/CACERTS “https hostname must be www.xx.com“---主要原因為在創(chuàng)建keystore是,CN沒設(shè)置成為服務(wù)器的域名,例如 www.auth.com.cn |