1.1服務端配置
1.1.1環境說明
- Windows10 64位
- jdk1.8.0_05
- apache-tomcat-8.0.47-windows-x64
- 會使用到的:cas-server-webapp-4.0.0.war、cas-client-core-3.2.1.jar、commons-logging、cas-server-support-jdbc-4.0.0.jar
- 確保本地jdk環境已經搭建好
1.1.2修改hosts文件
由於在本地測試的時候,服務端和客戶端默認的ip地址都是127.0.0.1,為了方便區分,所以需要為了服務端和客戶端配置不同的域名加以區分。
編輯文件 C:\Windows\System32\drivers\etc\hosts 在文件末端添加下面兩條信息:
- server.jix.com =>> 對應部署cas server的tomcat,這個虛擬域名還用於服務端證書生成
- client1.jix.com =>> 對應部署client1客戶端應用的tomcat
- client2.jix.com =>> 對應部署client2客戶端應用的tomcat
【由於CAS是基於HTTPS協議,所以需要配置服務端的tomcat,使之支持SSL安全協議訪問】
1.1.3配置https協議(安全證書配置)
1.打開cmd命令窗口
2.生成證書,在cmd窗口輸入以下命令:
keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass jixsso -validity 365 -keystore F:\jix\sso.keystore -storepass jixsso
[說明]:-alias后面的別名可以自定義,-keypass指定證書密鑰庫的密碼, -storepass和前面keypass密碼相同,否則下面tomcat 配置https 會訪問失敗 -keystore指定證書的位置,這里指定放在F盤的jix目錄,密鑰庫名稱可以自定義..這里是jixsso.keystore
3.命令輸入完成,回車之后,會提示你輸入一些資料,見下圖:
證書命令圖2.1
【注意】:第一個讓你輸入的“您的名字與姓氏是什么”,請必須輸入在C:\Windows\System32\drivers\etc\hosts文件中加入的服務端的域名.我這里也就是server.jix.com,為何這么做?首先cas只能通過域名來訪問,不能通過ip訪問,同時上方是生成證書,所以要求比較嚴格,所以如果不這么做的話,在完成最終配置之后,cas也可以正常訪問,訪問一個客戶端應用雖然能進入cas驗證首頁,但是,當輸入信息正確后,cas在回調轉入你想訪問的客戶端應用的時候,會出現No subject alternative names present錯誤異常信息,這個錯誤也就是在上面輸入的第一個問題答案不是域名導致、或者與hosts文件配置的不一致導致。
4.導出證書:
在cmd窗口繼續輸入以下命令,導出證書
keytool -export -alias ssodemo -keystore F:\jix\sso.keystore -file F:\jix\sso.crt -storepass jixsso
【說明】:-alias后面的名稱要與生成證書的命令里面的alias的名稱一致. –keystore后面指定證書存放的位置,這里我放在F盤jix目錄,同時證書名稱要與【生成證書】對應的命令里的keystore名稱一致.這里是sso.keystore,-file后面才crt路徑,我也指定在F盤jix目錄. –storepass的證書密碼要與上面輸入的密碼一致.
如下圖所示:
證書命令圖2.2
下面是F盤jix目錄下生成的crt文件:
證書位置圖2.3
5.客戶端導入證書
在cmd窗口輸入命令 (以管理員方式運行)
keytool -import -keystore "%JAVA_HOME%\../jre8\lib\security\cacerts" -file F:\jix\sso.crt -alias ssodemo3
【說明】:-file指定證書的位置,也就是上一步導出證書的位置,即F:\jix\sso.crt 命令中指定了JAVA_HOME,意思是將證書導入到客戶端證書庫,也就是jdk證書庫中.因為客戶端應用運行在本地,需要jdk的支持。
回車之后,會讓你輸入密鑰庫口令,注意,這里的密碼必須要輸入changeit,不能輸入上面指定的密碼jixsso,切記,否則導入客戶端證書會有問題,如果是多台機器演示,需要在每一台客戶端導入該證書,步驟都是一樣的。當看到提示“是否信任此證書”,輸入y回車即可,見下圖:(說明,命令中的-alias后面的別名可以自定義,如果出現【證書未導入,別名<***>已經存在】的錯誤,該意思是說客戶端的密鑰庫中已經存在該別名證書了,重新指定其他別名即可.
證書命令圖2.4
點擊回車可以看到證書已添加到秘鑰庫中
至此,CAS所需的證書環境,已經配置好。
下面,開始我們的CAS服務、Tomcat、以及多客戶端的配置及測試訪問。
1.1.4部署CAS-Server相關的Tomcat
1. 配置HTTPS
解壓apache-tomcat-8.0.47-windows-x64.zip,我本地路徑為E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server,編輯E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\conf\server.xml,找到下面片段:
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
去掉注釋,修改成:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile=" F:\jix\sso.keystore " keystorePass="jixsso"
clientAuth="false" sslProtocol="TLS" />
其中,keystoreFile就是創建證書的路徑,keystorePass就是創建證書的密碼
2. 驗證HTTPS配置
其他按照默認配置不作修改,雙擊E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\bin\startup.bat啟動tomcat 驗證https是否配置成功,我本地使用谷歌瀏覽器訪問,在地址欄輸入
https://server.jix.com:8443/出現下面畫面,其實這就表明cas服務端tomcat的https配置是沒有問題了.
服務端登錄圖2.5
點擊高級,然后繼續訪問,將會出現下面tomcat默認首頁.tomcat已經支持https協議訪問了,一切ok!
Tomcat頁面圖2.7
3. 部署CAS-Server
CAS-Server 下載地址:http://www.jasig.org/cas/download
本文以cas-server-webapp-4.0.0.rar為例,解壓提取cas-server-webapp-4.0.0.war文件,把改文件copy到E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\webapps目下,並重命名為:cas.war.
啟動tomcat,在瀏覽器地址欄輸入:https://server.jix.com:8443/cas ,回車,出現CAS服務端的登錄驗證首頁:
Cas登錄圖2.8
【說明】:此時,CAS只是單獨運行,至於登錄的用戶名和密碼是什么,請查看:
E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\webapps\cas\WEB-INF \deployerConfigContext.xml文件中有這樣一段
配置:
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
這個配置是默認靜態配置用戶名和密碼,那就在瀏覽器的CAS服務的登陸框中輸入用戶名casuser和密碼Mellon,登錄看看效果,就會出現驗證成功的頁面,如下圖。你也可以在文件中自己配置自己的用戶名和密碼。
登錄成功圖2.9
看到上述頁面表示CAS-Server已經部署成功。
1.1.5 CAS與數據庫交互
【說明】:我本地使用的是oracle數據庫。
1、,需要將幾個jar文件,放到CAS服務的lib目錄下,我本地使用的jar版本分別是commons-dbcp-1.2.1.jar、commons-pool.jar、cas-server-support-jdbc-4.0.0.jar、ojdbc6.jar,這4個缺一不可。將這4個jar放到E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\webapps\cas\WEB-INF\lib目錄下。
2、修改配置,支持mysql數據庫交互驗證
編輯E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server\webapps\cas\WEB-INF\ deployerConfigContext.xml文件,你會看到有這樣一段配置:
Cas服務端配置圖2.10
注釋掉第二個entry配置,最終配置如下:
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!-- 注釋這個-->
<!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->
<!-- key-ref指定自己的本地數據庫訪問 -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
</map>
</constructor-arg>
上述配置截圖:
Cas服務端配置圖2.11
然后再在這個xml中新加入2個bean配置,如下:
<!-- 指定dbcp數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@10.65.106.71:1521:orcl"></property>
<property name="username" value="dass_up"></property>
<property name="password" value="123"></property>
</bean>
<!-- 訪問遠程數據庫 -->
<bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource"></property>
<property name="sql" value="select password from t_system_user where username=?"></property>
</bean>
要說明的是,紅色標注的內容,我想大家都能看的明白,就是指定數據庫驅動和連接信息。其中,sql語句的意思就是,根據用戶名獲取密碼,CAS會根據你頁面輸入的用戶名獲取該用戶密碼,和你輸入的密碼進行校驗,來判斷輸入是否正確。Sql中的表換成遠程數據庫的表即可。只要根據用戶名查詢密碼即可。
以上配置截圖:
Cas服務端配置圖2.12
至此,CAS與數據庫交互驗證的配置已經配置完成,你可以重新訪問cas,輸入數據庫中存在的用戶名和密碼,來看看效果如何~如果登錄成功,說明配置無誤。否則,請耐心檢查配置是否有問題,jar包是否缺少。
現在,CAS已經支持數據庫交互驗證了,服務端tomcat也支持HTTPS協議訪問,現在,我們來搭建客戶端,實現多個客戶端的單點登錄。這里,我本地只使用2個tomcat客戶端來測試,其實已經滿足單點登錄的要求了,至少2個應用。
1.2 CAS客戶端配置
1.2.1 部署CAS客戶端相關的Tomcat
首先,客戶端應用是要和CAS服務端進行交互的,所以這里需要jar文件,放在客戶端應用的lib目錄下。分別是:cas-client-core-3.2.1.jar、commons-logging.jar
這里呢,我就直接使用tomcat默認自帶的 webapps\examples 作為測試的簡單web項目。我就不去另寫一個web測試的demo了。
既然需要2個客戶端應用,則需要2個tomcat做為客戶端服務器,所以,我本地解壓了2份tomcat,作為客戶端服務器,並重新命名,本地路徑分別為:E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1和E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 – client2
首先,將上面2個jar分別放到E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1\webapps\examples\WEB-INF\lib目錄
和E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 – client2\webapps\examples\WEB-INF\lib目錄
1、 配置apache-tomcat-7.0.57-client1客戶端1:
修改tomcat的啟動端口:
編輯E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1\conf\server.xml文件,找到如下2處內容:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
這里請將port="8080"修改成其他4位端口,不能和CAS服務端的tomcat相同,否則,在同一台機器上測試會出現端口占用的錯誤,我修改成18080,如果是在不同的機器上,則不需要配置這些。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
這里請將port="8009"修改成其他4位端口,不能和CAS服務端相同.我修改成18009
好,啟動這個tomcat,即運行E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1\bin\startup.bat,如果啟動窗口中沒有出現錯誤,說明端口配置無誤。請記住你配置的端口號。瀏覽器輸入 http://client1.jix.com:18080/examples/servlets/,請注意紅色部分域名,就是本文檔一開始需要配置的C:\Windows\System32\drivers\etc\hosts的域名,用於不同的客戶端域名訪問,回車:
客戶端登錄圖2.13
看到上述界面表示apache-tomcat-8.0.47 - client1的基本安裝配置已經成功。
接下來需要配置最重要的內容,讓客戶端應用和CAS服務連接:
編輯E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1\webapps\examples\WEB-INF\web.xml,在最下面加入如下配置:
<!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
<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>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://server.jix.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.jix.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://server.jix.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.jix.com:18080</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>
配置完成后,啟動CAS服務端tomcat,再啟動該客戶端1的tomcat,在瀏覽器訪問:
http://client1.jix.com:18080/examples/servlets/servlet/HelloWorldExample
看看是否跳轉到了CAS認證界面,回車之后,會出現如下圖:
Cas服務端登錄圖2.14
由於你沒有登錄CAS認證系統,CAS認證系統攔截到你訪問的客戶端應用,首先進入到認證系統登錄界面,同時URL后面加上你想訪問的地址信息,當你登錄成功后,CAS服務會轉向到你剛剛訪問的地址,也就是
http://client1.jix.com:18080/examples/servlets/servlet/HelloWorldExample
轉向到這個地址之后,瀏覽器會顯示如下內容:
客戶端驗證成功圖2.15
上面這個內容,顯示的就是你訪問tomcat中的examples項目的一個servlet的返回結果。
這里,你會發現瀏覽器地址欄多了一個內容,即多了一個jsessionid參數,這個就是CAS認證的原理所在,使用的是COOKIE機制。
1.2.2 配置CAS客戶端2
配置與上面的客戶端配置步驟相同,其中需要注意的就是,這第二個客戶端的tomcat端口要與上面的客戶端和CAS服務端的端口要不一樣,否則出現端口占用的錯誤。
主要配置如下:
客戶端配置圖2.16
Port修改成28080
Port修改成28009
修改編輯E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 – client2\webapps\examples\WEB-INF\web.xml文件,加入的內容就是上面在第一個客戶端的web.xml內容一致,只不過需要修改2處內容,就是幾個url地址, 最終的配置如下:
<!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
<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>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://server.jix.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.jix.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://server.jix.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.jix.com:28080</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>
1.2.3 測試驗證SSO
至此,2個客戶端也已經配置完畢,啟動配置好的三個tomcat分別為:CAS服務端tomcat、2個客戶端tomcat
我本地路徑分別為:
服務端tomcat:E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47-server
客戶端1:E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 - client1
客戶端2:E:\Tomcat-anzhuangbao\apache-tomcat-8.0.47-windows-x64\apache-tomcat-8.0.47 – client2
訪問客戶端1—-> 跳轉到cas server 驗證 —-> 顯示客戶端1的應用 —->新開選項卡訪問客戶端2 —-> 顯示客戶端2應用 —-> 注銷cas server —-> 打開客戶端1/客戶端2 —-> 重新跳轉到cas server 驗證.
下面截圖,根據上面所示進行測試,看看是否與上面說的流程一致:
首先,打開谷歌瀏覽器,地址欄輸入:
http://client1.jix.com:18080/examples/servlets/servlet/HelloWorldExample
回車,將會出現CAS認證界面:
服務端登錄圖2.17
輸入用戶名和密碼,登錄成功后,顯示的界面:
客戶端1登錄成功圖2.18
重新打開一個選項卡,地址欄輸入
http://client2.jix.com:28080/examples/servlets/servlet/HelloWorldExample
回車,將直接顯示客戶端2界面,沒有重新登錄,瀏覽器顯示界面:
客戶端2登錄圖2.19
根據上面顯示的界面,按照普通想邏輯,當訪問客戶端2的時候,應該會被CAS攔截,轉到CAS認證服務的界面,但是結果卻直接顯示客戶端2的界面,原因就是因為你在訪問客戶端1的時候已經登錄認證過了,CAS會在你瀏覽器中注入COOKIE,記錄你的認證憑證,如果你的瀏覽器沒有關閉或者退出的話,當你訪問客戶端2應用的時候,CAS檢測到認證的憑證,所以,就直接顯示了客戶端2的界面。
這里,其實就已經說明,CAS單點登錄系統已經搭建完畢!運行一切正常!
下面,我們新打開一個選項卡(也可在當前頁面的地址欄輸入),在瀏覽器地址欄中輸入
https://server.jix.com:8443/cas/logout
回車顯示:
Cas退出成功圖2.20
上述表示 認證注銷成功,此時如果再訪問 :
http://client1.jix.com:18080/examples/servlets/servlet/HelloWorldExample
或
http://client2.jix.com:28080/examples/servlets/servlet/HelloWorldExample
都將會跳轉到CAS服務重新進行認證。
到此,SSO之CAS單點登錄系統已經搭建完畢!