1、服務端配置:java
證書web
進入cmd,不需更改cdspring
第一種方法:sql
一、用JDK自帶的keytool生成證書數據庫
keytool -genkey -alias sso -keyalg RSA -keystore e:/keys/ssokey apache
其中名字與姓氏寫服務端域名,能夠在C:\Windows\System32\drivers\etc\hosts文件中映射一個虛擬域名(127.0.0.1 sso),注意不要寫IP。tomcat
二、導出證書安全
keytool -export -file e:/keys/ssokey.crt -alias sso -keystore e:/keys/ssokey服務器
三、把證書導入到客戶端JDK中session
把服務端導出的證書發送給客戶端,在客戶端導入
keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:/keys/ssokey.crt -alias sso
或者
keytool-import -trustcacerts -alias server -file e:/keys/ssokey.crt -keystore e:/keys/cacerts,將會在該目錄下產生一個cacerts文件,將這個文件,將這個文件拷貝覆蓋到
客戶端%JAVA_HOME%/jre/lib/security中。
服務端tomcat配置:
一、下載CAS的服務端,解壓,把解壓後的文件中modules文件夾中的cas-server-webapp-3.4.8.war文件拷貝的%TOMCAT_HOME%\webapps下,並修改文件名爲:cas.war。
二、修改%TOMCAT_HOME%\conf\server.xml文件去掉此文件83到93行之間的註釋,修改成:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile=" e:/keys/ssokey" <!--在2.1中生成的證書的位置-->
keystorePass="123456"/> <!--在2.1中設置的密碼-->
三、以上配置完成訪問http://localhost:8443/cas
點擊繼續瀏覽會出現,登錄驗證(此時用戶名和密碼相同便可)
讀取數據庫的信息進行身份驗證:
在 modules 目錄下能夠找到包cas-server-support-jdbc-3.3.4.jar,再下載個ojdbc的jar包,將兩個包拷貝到cas\WEB-INF\lib目錄下
DataStore依賴於 spring.jar, commons-collections.jar,commons-dbcp.jar, commons-pool.jar
在apache和spring官方網找到這四個包把它們拷貝到cas\WEB-INF\lib下
打開tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件
註釋掉92行:SimpleTestUsernamePasswordAuthenticationHandler這個驗證Handler,這個是比較簡單的,只是判斷用戶名和密碼相同便可經過,這個確定不能在實際應用中使用,棄用!
用下面的代碼替換:
<beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<propertyname="dataSource" ref="dataSource" />
<propertyname="sql" value="select password from users whereusername=?" />
<propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>
<!--<propertyname="passwordEncoder" ref="MyPasswordEncoder"/>-->
</bean>
在文件的末尾以前加入以下代碼:
<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<propertyname="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<propertyname="url"><value>jdbc:oracle:thin:@localhost :1521:orcl</value></property>
<propertyname="username"><value>hr</value></property>
<propertyname="password"><value>orcl</value></property>
</bean>
<bean id="MD5PasswordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-argindex="0">
<value>MD5</value>
</constructor-arg>
</bean>
密碼加密問題:
使用md5加密(32位)——oracle數據庫中要使用加密後的密碼
也能夠不加,只需將deployerConfigContext.xml中md5依賴取消,即下行代碼刪除
<propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>
解決中文亂碼
直接利用spring的編碼器進行utf-8編碼,在web.xml中添加
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
須要注意的是,此配置須要在
<filter-mapping>
<filter-name>CAS Client Info Logging Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>的上方
中文用戶名客戶端亂碼解決方案
因 爲cas默認對中文是不支持的,在cas服務端與客戶端之間,若是有中文存在,會有中文亂碼的問題,雖然上文對請求進行了編碼,可是客戶端中文亂碼的問題 始終存在。爲了不中文亂碼的存在,臨時解決方案是在服務器端對中文進行base64加密,在客戶端進行base64解密。
一、服務端加密:
找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver類的源代碼,這個類在cas-server-core-3.3.4.jar包中
找到 protectedString extractPrincipalId(final Credentials credentials)方法,將
returnusernamePasswordCredentials.getUsername();
改成return (newsun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes());
這樣就能夠在服務器端對全部用戶名進行base64加密了
二、客戶端解密:
在客戶端配置處說明
服務端配置完成,訪問https://sso:8443/cas,登錄驗證
2、客戶端配置:
注意:若是在一臺電腦上,不能使用同一個端口,本例客戶端使用8081端口
1、2.0x(是耶魯的版本):
下載cas-client-2.0.11.zip解壓
官方配置:
將cas-client-2.0.11\java\src源碼或則lib \ jar包(casclient.jar,servlet.jar)導入到現有工程,在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://192.168.135.231:8443/cas/login</param- value><!--這裏是cas服務器的地址,能夠用ip,也能夠用自定義地址,如本例的sso -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://sso:8443/cas/serviceValidate</param-value><!--這裏的是代理地址,爲證書中的服務端域名-->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8081</param-value><!--這裏是cas客戶端的地址,注意前邊不加http://,由於跳轉回來時已經有了-->
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<!--對訪問/servlet/HelloWorldExample 進行攔截,轉向cas服務器端驗證-->
<url-pattern>/*</url-pattern>
</filter-mapping>
自定義配置:
導入源碼,修改edu.yale.its.tp.cas.client.filter.CASFilter類
1. 聲明兩個屬性
private Stringcasclientport,casclientName,casserverport,casserverName;
2. 在init方法中添加
casclientport =config.getInitParameter("edu.yale.its.tp.cas.client.filter.port");
casclientName =config.getInitParameter("edu.yale.its.tp.cas.client.filter.serverName");
casserverport =config.getInitParameter("edu.yale.its.tp.cas.server.filter.port");
casserverName =config.getInitParameter("edu.yale.its.tp.cas.server.filter.serverName");
(獲取xml中指定的地址和端口號)
3. 在doFilter方法中添加
casLogin="https://"+casserverName+":"+casserverport+"/cas/login";//cas服務器的登入地址
casServerName=casclientName+":"+casclientport;//這是cas客戶端的地址,此處也可使用casServerName = request.getServerName()+":"+casclientport;
casValidate="https://"+casserverName+":"+casserverport+"/cas/serviceValidate";//cas服務器的驗證地址
四、修改客戶端web.xml
<!-- CAS -->
<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>/cas/login</param-value><!--默認無需修改 -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>/cas/serviceValidate</param-value><!--默認無需修改 -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.port</param-name>
<param-value>8081</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>
<init-param>
<param-name>edu.yale.its.tp.cas.server.filter.port</param-name>
<param-value>8443</param-value><!--對應服務器端口號 由於是ssl安全鏈接,因此是8443-->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.server.filter.serverName</param-name>
<param-value>sso</param-value><!--對應服務器域名-->
</init-param>
</filter>
<!-- 對訪問/*的都進行攔截,並轉向cas服務器,進行登入驗證 -->
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- CAS end -->
2.x版本暫時沒有找到單點登出,藉助3.x版本實現
下 載cas-client-3.1.12.zip並解壓,在modules文件夾中有jar包(cas-client-core- 3.1.12.jar,commons-logging-1.1.jar),複製到應用的WEB-INF/lib目錄中,或則複用源代碼。客戶端的 web.xml中添加:
<!-- 該過濾器用於實現單點登出功能可選配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CASSingle Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASSingle Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern> <!--這裏必須是/*,由於這裏是由SSO服務器向每一個客戶端發送請求,這裏負責攔截-->
</filter-mapping>
客戶端亂碼解決:
由於咱們上文對中文在服務器端進行了base64加密,在客戶端,就須要進行解密
仍是對CASFilter類進行修改
在讀doFilter方法中找到如下語句
if (session != null) // probably unncessary
session.setAttribute(CAS_FILTER_USER, user);
將它修改成
if (session != null) // probably unncessary
{
session.setAttribute(CAS_FILTER_USER, new String((new BASE64Decoder()).decodeBuffer(user)));
}
這就是對base64加密的數據進行解密後再存放進客戶端的session。
2、3.0x(jasig版本):
下載cas-client-3.1.12.zip並解壓,在modules文件夾中有須要的jar包,請根據本身的項目狀況選擇使用,複製到應用的WEB-INF/lib目錄中。客戶端的web.xml中添加:
<!-- ======================== 單點登陸開始 ========================-->
<!-- 該過濾器用於實現單點登出功能可選配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CASSingle Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASSingle Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern> <!--這裏必須是/*,由於這裏是由SSO服務器向每一個客戶端發送請求,這裏負責攔截-->
</filter-mapping>
<!--登陸 -->
<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://sso:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>localhost:8081</param-value>
</init-param>
<init-param>
<param-name>gateway</param-name>
<param-value>false </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://sso:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>localhost:8081</param-value>
</init-param>
<init-param>
<param-name>acceptAnyProxy</param-name>
<param-value>true </param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS HttpServletRequest WrapperFilter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
<filter-name>CAS Assertion Thread LocalFilter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASAuthentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASValidation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASHttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAssertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這裏可能出現org.apache.catalina.util.DefaultAnnotationProcessorcannot be cast to org….問題,修改了tomcat裏的context.xml文件,在context 元素下添加:
<Loader delegate="true" />
客戶端配置完成,訪問http://localhost:8081/xxxx ,驗證
登陸頁面的擴展:
(1) 如今CAS系統中存在的兩套登錄頁面cas/webapp/WEB-INF/view/jsp/default/ui/和cas/webapp/WEB-INF/view/jsp/simple/ui
(2) cas/webapp/WEB-INF/cas-servlet.xml
<bean
id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property
name="basename"
value="simple_views"/>
<property
name="order"
value="0"/>
</bean>
這個bean中basename屬性決定由哪一個屬性文件加載,simple_views.properties仍是default_views.Properties
而屬性文件:
cas/webapp/WEB-INF/classes/default_views.properties
cas/webapp/WEB-INF/classes/simple_views.properties
### Login view (/login)
casLoginView.(class)=org.springframework.web.servlet.view.JstlView
casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp
(登錄頁面)
### Login confirmation view (logged in,warn=true)
casLoginConfirmView.(class)=org.springframework.web.servlet.view.JstlView
casLoginConfirmView.url=/WEB-INF/view/jsp/default/ui/casConfirmView.jsp
(當選擇「警告」按鈕時,系統顯示的頁面)
### Logged-in view (logged in, no serviceprovided)
casLoginGenericSuccessView.(class)=org.springframework.web.servlet.view.JstlView
casLoginGenericSuccessView.url=/WEB-INF/view/jsp/default/ui/casGenericSuccess.jsp(成功登錄頁面)
每一個屬性文件決定具體加載頁面的名稱。
單點登出:
在客戶端的web.xml文件中增長:
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CASSingle Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASSingle Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
註銷的Filter要在其它Filter以前
界面的註銷鏈接到CAS的logout地址,如https://sso:8443/cas/logout
cas單點退出回到指定的頁面
退出的連接後加上?service=但願退出後返回的地址
例如 <ahref="https://sso:8443/cas/logout?service=http://localhost:8081/client1">退出</a>
本文所需資源下載地址:
cas-server-3.4.2.1-release.zip
http://download.csdn.net/detail/leilovegege/6800507
cas-client-3.1.12-release.zip
http://download.csdn.net/detail/leilovegege/6800481
cas-client-2.0.11.zip
http://download.csdn.net/detail/leilovegege/6800465
opensaml-1.1.jar
http://download.csdn.net/detail/leilovegege/6800361
tangosol.jar
http://download.csdn.net/detail/leilovegege/6800349