Cas Server下載:http://developer.jasig.org/cas/
Cas Client下載:http://developer.jasig.org/cas-clients/
測試環境:
jdk:java version "1.8.0_60"
tomcat:apache-tomcat-7.0.65
mysql:mysql5.5.40
CAS Server:cas-server-4.0.0-release.zip
CAS Client:cas-client-3.2.1-release.zip
此教程是在jdk和tomcat成功安裝的基礎上完成,至于jdk和tomcat的安裝大家可以網上找找資料。好吧,下面入正題。
一、生成證書
1、生成證書:
keytool -genkey -alias castest -keyalg RSA -keystore F:/keys/castest
生成一個別名為castest的證書。
此處需要特別注意口令(后續導入導出證書、CAS服務器端均要用到此口類)和“名字與姓氏”(為CAS跳轉域名,否則會報錯)
2、導出證書:
keytool -export -file F:/keys/castest.crt -alias castest -keystore F:/keys/castest
3、將證書導入到客戶端JRE中(注意、是導入JRE中),如果security中已經存在cacerts,需要先將其刪除。
keytool -import -keystore "D:\Program Files\Java\jdk1.8.0_60\jre\lib\security\cacerts" -file F:/keys/castest.crt -alias castest
二、配置服務器端
1、從http://developer.jasig.org/cas/上下載cas服務器端cas-server-4.0.0-release.zip,在modules目錄下找到cas-server-webapp-4.0.0.war,將其復制到%TOMCAT_HOME%\webapps下,并將名稱改為cas.war
2、修改%TOMCAT_HOME%\conf\server.xml文件,去掉此文件83到93行之間的注釋,修改為:
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="F:/keys/castest" <!—生成證書時的路徑,證書名--> keystorePass="castest" <!—證書密碼--> maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
3、測試:https://localhost:8443/
點擊繼續瀏覽此網頁
如果此時可以正常訪問,說明證書安裝成功
https://localhost:8443/cas/login,出現
輸入賬號和密碼
casuser
Mellon
此時說明服務器端已經配置成功。可通過https://localhost:8443/cas/logout退出登錄
三、配置客戶端
1. 從http://developer.jasig.org/cas-clients/上下載cas-client-3.2.1-release.zip,在modules目錄下找到cas-client-core-3.2.1.jar、commons-logging-1.1.jar復制到項目WEB-INF/lib下
2. 添加映射域名,在C:\Windows\System32\drivers\etc\hosts文件中添加
127.0.0.1 sso.castest.com
3. 創建web項目CasClient,并在項目的web.xml配置過濾器
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>cas-demo</display-name><!-- ======================== 單點登錄開始 ======================== --><!-- 用于單點退出,該過濾器用于實現單點登出功能,可選配置--><listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!-- 該過濾器用于實現單點登出功能,可選配置。 --><filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>CAS Single Sign Out Filter</filter-name><url-pattern>/CasClient/*</url-pattern></filter-mapping><!-- 該過濾器負責用戶的認證工作,必須啟用它 --><filter><filter-name>CASFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https://sso.castest.com:8443/cas/login</param-value><!--這里的server是服務端的IP--></init-param><init-param><param-name>serverName</param-name><param-value>http://localhost:8080</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 --><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.castest.com:8443/cas/</param-value><!-- 此處必須為登錄url/cas/,帶有任何其它路徑都會報錯,如“https://sso.castest.com:8443/cas/login”,這樣也會報錯。 --></init-param><init-param><param-name>serverName</param-name><param-value>http://localhost:8080</param-value></init-param></filter><filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--該過濾器負責實現HttpServletRequest請求的包裹,比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。--><filter><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。比如AssertionHolder.getAssertion().getPrincipal().getName()。--><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 Assertion Thread Local Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- ======================== 單點登錄結束 ======================== --><!-- session超時定義,單位為分鐘 --><session-config><session-timeout>2</session-timeout></session-config></web-app>
4. 此時訪問http://localhost:8080/CasClient/Index.jsp時會自動跳轉到sso.castest.com下去登錄
輸入賬號和密碼casuser:Mellon
此時客戶端已安裝成功。
可以用類似的方式新建多個站點,站點1登錄以后站點而無需登錄也可訪問,如果未登錄則會跳轉到相應的url進行登錄驗證。
至此,簡單的服務器搭建已經完成了。然而,此時用戶的驗證是通過配置文件cas\WEB-INF\deployerConfigContext.xml中指定用戶名和密碼的方式進行驗證的。
下面再另行介紹通過mysql數據庫驗證的方式。
一、CAS認證之mysql數據庫認證
1、在mysql中新建一個cas數據庫并創建user表
CREATE DATABASE /*!32312 IF NOT EXISTS*/`cas` /*!40100 DEFAULT CHARACTER SET gbk */;USE `cas`;/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,`used` tinyint(2) NOT NULL,PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;/*Data for the table `user` */insert into `user`(`id`,`name`,`password`,`used`) values (1,'casuser','9414f9301cdb492b4dcd83f8c711d8bb',1);
2、CAS的HTTP模式與HTTPS設置(可省略)
1)cas\WEB-INF\deployerConfigContext.xml,新增p:requireSecure="false"<bean id="proxyAuthenticationHandler" class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient" p:requireSecure="false"/>2)cas\WEB-INF\spring-configurationticketGrantingTicketCookieGenerator.xml設置p:cookieSecure="false"warnCookieGenerator.xml設置p:cookieSecure="false"
http://localhost:8080/cas/login,進入登錄頁面。
默認用戶為casuser/Mellon,登錄成功即配置完成。
3、設置利用數據庫來驗證用戶
依賴包:
c3p0-0.9.1.2.jar
mysql-connector-java-5.1.21.jar
cas-server-support-jdbc-4.0.0.jar
cas\WEB-INF\deployerConfigContext.xml1)更換驗證方式 <!--<bean id="primaryAuthenticationHandler"class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler"><property name="users"><map><entry key="casuser" value="Mellon"/></map></property></bean>--><!-- Define the DB Connection --><bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"p:driverClass="com.mysql.jdbc.Driver"p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"p:user="root"p:password="root" /><!-- Define the encode method--><!--<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName"> <constructor-arg value="MD5"/> </bean> --><bean id="passwordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"c:encodingAlgorithm="MD5"p:characterEncoding="UTF-8" /><bean id="dbAuthHandler"class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"p:dataSource-ref="dataSource"p:sql="select password from user where name=? and used=1"p:passwordEncoder-ref="passwordEncoder"/><!-- p:passwordEncoder-ref="passwordEncoder" -->2)更換驗證Handle <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager"><constructor-arg><map><!--| IMPORTANT| Every handler requires a unique name.| If more than one instance of the same handler class is configured, you must explicitly| set its name to something other than its default name (typically the simple class name).--><entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" /><entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" /><!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> --></map></constructor-arg>