最近公司的一個項目須要用到單點登陸的功能,以前對單點登陸瞭解得很少。因而網上找了下單點登陸的解決方案,發現CAS是個不錯的解決方案。因而搭個環境測試了一下。這裏記錄下測試的詳細步驟。java
官網:http://jasig.github.io/cas/mysql
Cas Server下載:http://developer.jasig.org/cas/git
Cas Client下載:http://developer.jasig.org/cas-clients/github
測試環境:web
jdk:java version "1.8.0_60"sql
tomcat:apache-tomcat-7.0.65數據庫
mysql:mysql5.5.40apache
CAS Server:cas-server-4.0.0-release.ziptomcat
CAS Client:cas-client-3.1.12-release.zip服務器
此教程是在jdk和tomcat成功安裝的基礎上完成,至於jdk和tomcat的安裝你們能夠網上找找資料。好吧,下面入正題。
1、生成證書
一、生成證書:
keytool -genkey -alias castest -keyalg RSA -keystore F:/keys/castest
生成一個別名爲castest的證書。
此處須要特別注意口令(後續導入導出證書、CAS服務器端均要用到此口類)和「名字與姓氏」(爲CAS跳轉域名,不然會報錯)
二、導出證書:
keytool -export -file F:/keys/castest.crt -alias castest -keystore F:/keys/castest
三、將證書導入到客戶端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
2、配置服務器端
一、從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
二、修改%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"/>
三、測試:https://localhost:8443/
點擊繼續瀏覽此網頁
若是此時能夠正常訪問,說明證書安裝成功
https://localhost:8443/cas/login,出現
輸入帳號和密碼
casuser
Mellon
此時說明服務器端已經配置成功。可經過https://localhost:8443/cas/logout退出登陸
3、配置客戶端
1. 從http://developer.jasig.org/cas-clients/上下載cas-client-3.1.12-release.zip,在modules目錄下找到cas-client-core-3.1.12.jar、commons-collections-3.2.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數據庫驗證的方式。