流程梳理
- 配置安全證書
1.1 將證書導(dǎo)入到tomcat(客戶端的tomcat)所使用的jdk密鑰庫中
1.2 將證書拷貝到指定目錄(本例拷貝到tomcat的conf下) - 部署CAS服務(wù)端
2.1 指定服務(wù)端tomcat 所使用的jdk版本
2.2 開啟tomcat HTTPS(CAS服務(wù)端的tomcat)
2.3 將CAS的war包拷貝到tomcat的webapp下
2.4 修改CAS配置文件deployerConfigContext.xml税肪,使其支持不同的校驗(yàn)方式 - 部署CAS客戶端
3.1 將所需jar包拷貝到web項(xiàng)目的lib下
3.2 修改web.xml配置文件
準(zhǔn)備工作
- 準(zhǔn)備如下軟件包(我實(shí)在window 10 64位系統(tǒng)做的實(shí)驗(yàn))
apache-tomcat-7.0.79.zip
jdk1.7.0_80
cas-server-webapp-4.0.0.war
cas-client-core-3.2.1.jar
commons-logging-1.2.jar
說明:需要3個(gè)tomcat蹋凝,部署CAS中心服務(wù)器肉康、客戶端1號(hào)服務(wù)器奶甘、客戶端2號(hào)服務(wù)器
- 配置hosts文件
文件位置:C:\Windows\System32\drivers\etc\hosts嗓违,在文件最下方加入
127.0.0.1 server.sso.com
127.0.0.1 app1.sso.com
127.0.0.1 app2.sso.com
說明:
server.sso.com --- CAS中心服務(wù)器,這個(gè)域名要與證書域名相同
app1.sso.com --- 客戶端1號(hào)服務(wù)器
app2.sso.com --- 客戶端2號(hào)服務(wù)器
開始部署
1. 配置安全證書
生成證書
使用cmd進(jìn)入jdk的bin目錄焊刹,之后輸入
keytool -genkey -alias ssocas -keyalg RSA -keysize 1024 -keypass hopisso -validity 90 -keystore hopi.keystore -storepass hopisso
命令截圖:
上圖中的紅色框必須與CAS中心服務(wù)器域名相同
導(dǎo)出證書
繼續(xù)在cmd下輸入
keytool -export -alias ssocas -keystore hopi.keystore -file ssocas.crt -storepass hopisso
命令截圖:
導(dǎo)出證書
查看生成文件:
生成對(duì)應(yīng)文件
導(dǎo)入證書
繼續(xù)在cmd下輸入
keytool -import -keystore E:\Dev\DevTools\Runtimes\Java\jdk1.7.0_80\bin\jre\lib\security\cacerts -file ssocas.crt -alias ssocas
說明:證書需要導(dǎo)入客戶端tomcat所使用的jdk中
命令截圖:
注意:輸入密鑰庫口令:要輸入changeit,它是jdk密鑰庫的默認(rèn)密碼唆香,而不是我們之前指定的密碼hopisso
拷貝證書
將證書文件hopi.keystore拷貝到將要部署CAS中心服務(wù)器的tomcat的conf目錄下
操作截圖:
開啟HTTPS
編輯該目錄下的server.xml文件,找到如下圖位置:
修改成:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
keystorePass="hopisso" keystoreFile="/conf/hopi.keystore"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"/>
修改后截圖:
指定Tomcat 所使用的jdk
修改tomcat \bin目錄下的catalina.bat 與 setclasspath.bat
catalina.bat
setclasspath.bat
部署CAS服務(wù)端
將cas-server-webapp-4.0.0.war修改為cas.war并拷貝到CAS中心服務(wù)器的tomcat下的webapp下,啟動(dòng)CAS中心服務(wù)器的tomcat吨艇,點(diǎn)擊進(jìn)入CAS中心服務(wù)器
進(jìn)入中心服務(wù)器
點(diǎn)高級(jí)后再點(diǎn)繼續(xù)前往server.sso.com(不安全)
進(jìn)入CAS中心服務(wù)器首頁
在CAS中心服務(wù)器的tomcat中找到下圖文件
可以看到我們CAS中心服務(wù)器的默認(rèn)用戶名和密碼
輸入對(duì)應(yīng)的用戶名和密碼后可以看到如下圖所示:
現(xiàn)在說明我們的CAS中心服務(wù)器已經(jīng)部署成功
部署CAS客戶端
拷貝jar包
將cas-client-core-3.2.1.jar和commons-logging-1.2.jar拷貝到我們的客戶端項(xiàng)目中(這里我使用了tomcat默認(rèn)的examples項(xiàng)目)躬它,見下圖
配置端口
找到客戶端tomcat服務(wù)器下的conf\server.xml文件
修改如下3個(gè)端口
原來是8005
原來是8080
原來是8009
修改web.xml
找到客戶端tomcat的webapps\examples\WEB-INF\web.xml文件,在最下面加入如下配置
<!-- 用于單點(diǎn)退出东涡,該過濾器用于實(shí)現(xiàn)單點(diǎn)登出功能冯吓,可選配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 該過濾器用于實(shí)現(xiàn)單點(diǎn)登出功能,可選配置 -->
<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.sso.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.sso.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器負(fù)責(zé)對(duì)Ticket的校驗(yàn)工作疮跑,必須啟用它 -->
<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.sso.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://app1.sso.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
該過濾器負(fù)責(zé)實(shí)現(xiàn)HttpServletRequest請(qǐng)求的包裹桑谍,比如允許開發(fā)者通過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>
<!--
該過濾器使得開發(fā)者可以通過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>
配置完成后贿条,啟動(dòng)CAS中心服務(wù)器的tomcat雹仿,再啟動(dòng)客戶端1號(hào)服務(wù)器的tomcat,在瀏覽器訪問:http://app1.sso.com:18080/examples/servlets/servlet/HelloWorldExample看看是否跳轉(zhuǎn)到了CAS認(rèn)證界面整以,回車之后胧辽,會(huì)出現(xiàn)如下圖:
觀察會(huì)發(fā)現(xiàn)瀏覽器的地址欄中URL信息是這樣的:
https://server.sso.com:8443/cas/login?service=http%3A%2F%2Fapp1.sso.com%3A18080%2Fexamples%2Fservlets%2Fservlet%2FHelloWorldExample
我想你已經(jīng)知道什么意思了,由于你沒有登錄CAS中心服務(wù)器認(rèn)證系統(tǒng)公黑,CAS客戶端1號(hào)攔截到你訪問的客戶端應(yīng)用邑商,首先進(jìn)入到CAS中心服務(wù)器認(rèn)證系統(tǒng)登錄界面,同時(shí)URL后面加上你想訪問的地址信息凡蚜,當(dāng)你登錄成功后人断,CAS中心服務(wù)器會(huì)轉(zhuǎn)向到你剛剛訪問的地址,也就是:
http://app1.sso.com:18080/examples/servlets/servlet/HelloWorldExample;jsessionid=B99CBA08ADD2C4F1A8661195CD79F5DD
轉(zhuǎn)向到這個(gè)地址之后朝蜘,瀏覽器會(huì)顯示如下內(nèi)容:
上面這個(gè)內(nèi)容恶迈,顯示的就是你訪問tomcat中的examples項(xiàng)目的一個(gè)servlet的返回結(jié)果。這里谱醇,如果你夠細(xì)心的話暇仲,你會(huì)發(fā)現(xiàn)瀏覽器地址欄又多了一個(gè)內(nèi)容,即多了一個(gè)jsessionid參數(shù)副渴,這個(gè)就是CAS認(rèn)證的原理所在奈附,使用的是COOKIE機(jī)制。
按照上面的方法來配置客戶端2號(hào)服務(wù)器
登出
在瀏覽器中輸入連接:https://server.sso.com:8443/cas/logout可登出系統(tǒng)
擴(kuò)展知識(shí)
數(shù)據(jù)庫校驗(yàn)
如何配置用戶名和密碼通過數(shù)據(jù)庫進(jìn)行交互驗(yàn)證的呢煮剧?
- 需要將幾個(gè)jar文件斥滤,放到CAS服務(wù)的lib目錄下讼载,我本地使用的jar版本分別是c3p0-0.9.1.2.jar、cas-server-support-jdbc-4.0.0.jar中跌、mysql-connector-java-5.1.13-bin.jar,這3個(gè)缺一不可菇篡。將這3個(gè)jar放到CAS中心服務(wù)器的tomcat \webapps\cas\WEB-INF\lib目錄下漩符。
- 修改配置,支持mysql數(shù)據(jù)庫交互驗(yàn)證編輯CAS中心服務(wù)器的tomcat \webapps\cas\WEB-INF\ deployerConfigContext.xml文件驱还,你會(huì)看到有這樣一段配置:
注釋掉第二個(gè)entry配置嗜暴,最終配置如下:
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!-- 注釋這個(gè)-->
<!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->
<!-- key-ref指定自己的本地?cái)?shù)據(jù)庫訪問 -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
</map>
</constructor-arg>
然后再在這個(gè)xml中新加入2個(gè)bean配置,如下:
<!-- 指定c3p0數(shù)據(jù)源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property ame="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/myProject?useUnicode=true&characterEncoding=UTF-8" />
<property name="user" value="root" />
<property name="password" value="root
</bean>
<!-- 訪問本地?cái)?shù)據(jù)庫 -->
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="SELECT u.`password` FROM `sec_user` u WHERE u.`account` = ?" />
現(xiàn)在议蟆,CAS已經(jīng)支持?jǐn)?shù)據(jù)庫交互驗(yàn)證了闷沥,服務(wù)端tomcat也支持HTTPS協(xié)議訪問,現(xiàn)在咐容,我們來搭建客戶端舆逃,實(shí)現(xiàn)多個(gè)客戶端的單點(diǎn)登錄。這里戳粒,我本地只使用2個(gè)tomcat客戶端來測(cè)試路狮,其實(shí)已經(jīng)滿足單點(diǎn)登錄的要求了,至少2個(gè)應(yīng)用蔚约。