【環(huán)境說(shuō)明】:
本文演示過(guò)程在同一個(gè)機(jī)器上的(也可以在三臺(tái)實(shí)體機(jī)器或者三個(gè)的虛擬機(jī)上)箭启,環(huán)境如下:
windows7 64位
jdk1.7.0_51
apache-tomcat-7.0.57-windows-x64
cas-server-webapp-4.0.0.war筷登、cas-client-core-3.2.1.jar、commons-logging.jar
確保本地jdk環(huán)境已經(jīng)搭建好
【軟件說(shuō)明】:
涉及到的一些jar,還有cas服務(wù)的war饲宿,由于CSDN上傳文件最大只支持10M,但cas服務(wù)的war有20M左右履植。為了方便良瞧,如果你們需要的話陪汽,可以聯(lián)系我,我發(fā)給你們褥蚯。
聯(lián)系郵箱 842324724@qq.com挚冤,或者QQ 842324724。
根據(jù)演示需求赞庶,用修改hosts 文件的方法添加域名最簡(jiǎn)單方便(這個(gè)非常重要训挡,因?yàn)镃AS單點(diǎn)登錄系統(tǒng)是基于JAVA安全證書的 https 訪問(wèn), 要使用CAS單點(diǎn)登錄必須要配置域名, cas是不能通過(guò)ip訪問(wèn)的.)歧强,編輯文件 C:\Windows\System32\drivers\etc\hosts 在文件末端添加下面三條信息:
127.0.0.1 server.zhoubang85.com
127.0.0.1 client1.zhoubang85.com
127.0.0.1 client2.zhoubang85.com
server.zhoubang85.com =>> 對(duì)應(yīng)部署cas server的tomcat澜薄,這個(gè)虛擬域名還用于服務(wù)端證書生成
client1.zhoubang85.com =>> 對(duì)應(yīng)部署client1客戶端應(yīng)用的tomcat
client2.zhoubang85.com =>> 對(duì)應(yīng)部署client2客戶端應(yīng)用的tomcat
【注意】:上面3個(gè)ip都是127.0.0.1,這是為什么呢摊册?因?yàn)槲业沫h(huán)境都是在同一臺(tái)機(jī)器肤京,所以ip都是一致的,我們?cè)侔巡煌姆?wù)端和客戶端應(yīng)用茅特,使用不同域名加以區(qū)分忘分。一個(gè)域名對(duì)應(yīng)一個(gè)應(yīng)用,模擬多端白修!
【由于CAS是基于HTTPS協(xié)議妒峦,所以需要配置服務(wù)端的tomcat,使之支持SSL安全協(xié)議訪問(wèn)】
【說(shuō)明】:當(dāng)然也可以設(shè)置cas支持http訪問(wèn)兵睛,這個(gè)之后再補(bǔ)充討論肯骇,下面先配置https協(xié)議.
【安全證書配置】:
1 打開cmd命令窗口
2 生成證書,在cmd窗口輸入以下命令:
keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass zhoubang -validity 365 -keystore c:\zhoubang.keystore -storepass zhoubang
【說(shuō)明】:-alias后面的別名可以自定義卤恳,-keypass指定證書密鑰庫(kù)的密碼, -storepass和前面keypass密碼相同,否則下面tomcat 配置https 會(huì)訪問(wèn)失敗 -keystore指定證書的位置,這里指定放在c盤根目錄,密鑰庫(kù)名稱可以自定義累盗,這里是zhoubang.keystore
3 命令輸入完成,回車之后突琳,會(huì)提示你輸入一些資料若债,見下圖:
【注意】:第一個(gè)讓你輸入的“您的名字與姓氏是什么”,請(qǐng)必須輸入在C:\Windows\System32\drivers\etc\hosts文件中加入的服務(wù)端的域名拆融。
我這里也就是server.zhoubang85.com蠢琳,為何這么做?
首先cas只能通過(guò)域名來(lái)訪問(wèn)镜豹,不能通過(guò)ip訪問(wèn)傲须,同時(shí)上方是生成證書,所以要求比較嚴(yán)格趟脂,所以如果不這么做的話泰讽,及時(shí)最終按照教程配置完成,cas也可以正常訪問(wèn),訪問(wèn)一個(gè)客戶端應(yīng)用雖然能進(jìn)入cas驗(yàn)證首頁(yè),但是已卸,當(dāng)輸入信息正確后佛玄,cas在回調(diào)轉(zhuǎn)入你想訪問(wèn)的客戶端應(yīng)用的時(shí)候,會(huì)出現(xiàn)No subject alternative names present錯(cuò)誤異常信息累澡,這個(gè)錯(cuò)誤也就是在上面輸入的第一個(gè)問(wèn)題答案不是域名導(dǎo)致梦抢、或者與hosts文件配置的不一致導(dǎo)致。
4.導(dǎo)出證書:
在cmd窗口繼續(xù)輸入以下命令愧哟,導(dǎo)出證書:
keytool -export -alias ssodemo -keystore c:\zhoubang.keystore -file c:\ssodemo.crt -storepass zhoubang
【說(shuō)明】:-alias后面的名稱要與生成證書的命令里面的alias的名稱一致. –keystore后面指定證書存放的位置奥吩,這里我放在C盤根目錄,同時(shí)證書名稱要與【生成證書】對(duì)應(yīng)的命令里的keystore名稱一致.這里是zhoubang.keystore蕊梧,-file后面才crt路徑霞赫,我也指定在c盤根目錄. –storepass的證書密碼要與上面輸入的密碼一致.
如下圖所示:
我們?cè)倏纯碿盤下面是否生成crt文件:
5.客戶端導(dǎo)入證書
在cmd窗口輸入命令:
keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file c:\ssodemo.crt -alias ssodemo
【說(shuō)明】:-file指定證書的位置,也就是上一步導(dǎo)出證書的位置肥矢,即c:\ ssodemo.crt 命令中指定了JAVA_HOME绩脆,意思是將證書導(dǎo)入到客戶端證書庫(kù),也就是jdk證書庫(kù)中.因?yàn)榭蛻舳藨?yīng)用運(yùn)行在本地橄抹,需要jdk的支持。
回車之后惕味,會(huì)讓你輸入密鑰庫(kù)口令楼誓,注意,這里的密碼必須要輸入changeit名挥,不能輸入上面指定的密碼zhoubang疟羹,切記,否則導(dǎo)入客戶端證書會(huì)有問(wèn)題禀倔,如果是多臺(tái)機(jī)器演示榄融,需要在每一臺(tái)客戶端導(dǎo)入該證書,步驟都是一樣的救湖。當(dāng)看到提示“是否信任此證書”愧杯,輸入y回車即可,見下圖:(說(shuō)明鞋既,命令中的-alias后面的別名可以自定義,如果出現(xiàn)【證書未導(dǎo)入力九,別名<***>已經(jīng)存在】的錯(cuò)誤,該意思是說(shuō)客戶端的密鑰庫(kù)中已經(jīng)存在該別名證書了邑闺,重新指定其他別名即可.)
【注意項(xiàng)】:由于是本地沒(méi)有證書跌前,證書是自己生成的,所以陡舅,務(wù)必將生成的證書導(dǎo)入到j(luò)re的證書鏈中抵乓,不然是無(wú)法支持CAS認(rèn)證服務(wù)的。
至此,CAS所需的證書環(huán)境灾炭,已經(jīng)配置好茎芋。
下面,開始我們的CAS服務(wù)咆贬、Tomcat败徊、以及多客戶端的配置及測(cè)試訪問(wèn)。
部署CAS-Server相關(guān)的Tomcat
1 配置HTTPS
解壓apache-tomcat-7.0.57-windows-x64.zip掏缎,我本地路徑為E:\apache-tomcat-7.0.57皱蹦,編輯E:\apache-tomcat-7.0.57\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="C:/zhoubang.keystore" keystorePass="zhoubang"
clientAuth="false" sslProtocol="TLS" />
其中沪哺,keystoreFile就是創(chuàng)建證書的路徑,keystorePass就是創(chuàng)建證書的密碼.
2 驗(yàn)證HTTPS配置
其他按照默認(rèn)配置不作修改辜妓,雙擊E:\apache-tomcat-7.0.57\bin \startup.bat 啟動(dòng)tomcat 驗(yàn)證https是否配置成功忌怎,我本地使用火狐瀏覽器訪問(wèn),在地址欄輸入
https://server.zhoubang85.com:8443/ 出現(xiàn)下面畫面榴啸,其實(shí)這就表明cas服務(wù)端tomcat的https配置是沒(méi)有問(wèn)題了.
點(diǎn)擊【我已充分了解可能的風(fēng)險(xiǎn)】,點(diǎn)擊出現(xiàn)的【添加例外】—【確認(rèn)安全例外】鸥印,勋功,將會(huì)出現(xiàn)下面tomcat默認(rèn)首頁(yè).tomcat已經(jīng)支持https協(xié)議訪問(wèn)了,一切ok!
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:\apache-tomcat-7.0.57\webapps 目下夏块,并重命名為:cas.war脐供。
啟動(dòng)tomcat政己,在瀏覽器地址欄輸入:https://server.zhoubang85.com:8443/cas ,回車,出現(xiàn)CAS服務(wù)端的登錄驗(yàn)證首頁(yè):
首頁(yè)默認(rèn)是英文的果港,點(diǎn)擊紅色框的鏈接辛掠,切換成中文顯示萝衩。當(dāng)然没咙,并不是所有的地方都會(huì)變成中文祭刚,這個(gè)不作講解涡驮。
【說(shuō)明】:此時(shí)捉捅,CAS只是單獨(dú)運(yùn)行锯梁,至于登錄的用戶名和密碼是什么陌凳,請(qǐng)查看:E:\apache-tomcat-7.0.57\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>
這個(gè)配置是默認(rèn)靜態(tài)配置用戶名和密碼合敦,那就在瀏覽器的CAS服務(wù)的登陸框中輸入用戶名casuser和密碼Mellon充岛,登錄看看效果崔梗,就會(huì)出現(xiàn)驗(yàn)證成功的頁(yè)面蒜魄,如下圖谈为。你也可以在文件中自己配置自己的用戶名和密碼。
看到上述頁(yè)面表示CAS-Server已經(jīng)部署成功。
用戶名和密碼肯定需要和數(shù)據(jù)庫(kù)進(jìn)行交互驗(yàn)證的柒瓣,嘹朗,那么屹培,如何配置呢怔檩?
【說(shuō)明】:我本地使用的是mysql數(shù)據(jù)庫(kù)薛训。
1乙埃、需要將幾個(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放到E:\apache-tomcat-7.0.57\webapps\cas\WEB-INF\lib目錄下票腰。
2杏慰、修改配置缘滥,支持mysql數(shù)據(jù)庫(kù)交互驗(yàn)證
編輯E:\apache-tomcat-7.0.57\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ù)庫(kù)訪問(wèn) -->
<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>
<!-- 訪問(wèn)本地?cái)?shù)據(jù)庫(kù) -->
<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` = ?" />
要說(shuō)明的是,紅色標(biāo)注的內(nèi)容聋丝,我想大家都能看的明白潮针,就是指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)和連接信息。其中端圈,sql語(yǔ)句的意思就是舱权,根據(jù)用戶名獲取密碼宴倍,CAS會(huì)根據(jù)你頁(yè)面輸入的用戶名獲取該用戶密碼鸵贬,和你輸入的密碼進(jìn)行校驗(yàn)阔逼,來(lái)判斷輸入是否正確嗜浮。
其中危融,sql中的表?yè)Q成你自己本地的表即可吉殃,或者自己手動(dòng)新建一個(gè)表寨腔,加入幾條測(cè)試數(shù)據(jù)即可迫卢。只要根據(jù)用戶名查詢密碼即可乾蛤。
上述配置截圖:
現(xiàn)在眨层,CAS已經(jīng)支持?jǐn)?shù)據(jù)庫(kù)交互驗(yàn)證了趴樱,服務(wù)端tomcat也支持HTTPS協(xié)議訪問(wèn)叁征,現(xiàn)在捺疼,我們來(lái)搭建客戶端啤呼,實(shí)現(xiàn)多個(gè)客戶端的單點(diǎn)登錄官扣。這里醇锚,我本地只使用2個(gè)tomcat客戶端來(lái)測(cè)試焊唬,其實(shí)已經(jīng)滿足單點(diǎn)登錄的要求了赶促,至少2個(gè)應(yīng)用鸥滨。
4 部署CAS客戶端相關(guān)的Tomcat
首先老速,客戶端應(yīng)用是要和CAS服務(wù)端進(jìn)行交互的橘券,所以這里需要jar文件旁舰,放在客戶端應(yīng)用的lib目錄下箭窜。分別是:cas-client-core-3.2.1.jar磺樱、commons-logging.jar
這里呢竹捉,我就直接使用tomcat默認(rèn)自帶的 webapps\examples 作為演示的簡(jiǎn)單web項(xiàng)目物遇。我就不去另寫一個(gè)web測(cè)試的demo了。
既然需要2個(gè)客戶端應(yīng)用起趾,則需要2個(gè)tomcat做為客戶端服務(wù)器训裆,所以边琉,我本地解壓了2份tomcat变姨,作為客戶端服務(wù)器定欧,并重新命名,本地路徑分別為:E:\apache-tomcat-7.0.57-client1和E:\apache-tomcat-7.0.57-client2
首先爷辱,將上面2個(gè)jar分別放到E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\lib目錄
和E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\lib目錄托嚣。
配置apache-tomcat-7.0.57-client1客戶端1:
修改tomcat的啟動(dòng)端口:
編輯E:\apache-tomcat-7.0.57-client1\conf\server.xml文件示启,找到如下2處內(nèi)容:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
這里請(qǐng)將port="8080"修改成其他4位端口,不能和CAS服務(wù)端的tomcat相同舍咖,否則排霉,在同一臺(tái)機(jī)器上測(cè)試會(huì)出現(xiàn)端口占用的錯(cuò)誤攻柠,我修改成18080冒滩,如果是在不同的機(jī)器上开睡,則不需要配置這些篇恒。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
這里請(qǐng)將port="8009"修改成其他4位端口婚度,不能和CAS服務(wù)端相同.我修改成18009
好,啟動(dòng)這個(gè)tomcat哮翘,即運(yùn)行E:\apache-tomcat-7.0.57-client1\bin\startup.bat饭寺,如果啟動(dòng)窗口中沒(méi)有出現(xiàn)錯(cuò)誤艰匙,說(shuō)明端口配置無(wú)誤员凝。請(qǐng)記住你配置的端口號(hào)。
瀏覽器輸入 http://client1.zhoubang85.com:18080/examples/servlets/糖埋,請(qǐng)注意紅色部分域名,就是教程一開始需要配置的C:\Windows\System32\drivers\etc\hosts的域名瞳别,用于不同的客戶端域名訪問(wèn)倍奢,回車:
好,啟動(dòng)這個(gè)tomcat叼架,即運(yùn)行E:\apache-tomcat-7.0.57-client1\bin\startup.bat ,如果啟動(dòng)窗口中沒(méi)有出現(xiàn)錯(cuò)誤乍构,說(shuō)明端口配置無(wú)誤哥遮。請(qǐng)記住你配置的端口號(hào)。
瀏覽器輸入 http://client1.zhoubang85.com:18080/examples/servlets/仪召, 請(qǐng)注意紅色部分域名,就是教程一開始需要配置的 C:\Windows\System32\drivers\etc\hosts 的域名扔茅,用于不同的客戶端域名訪問(wèn),回車:
看到上述界面表示apache-tomcat-7.0.57-client1的基本安裝配置已經(jīng)成功。
接下來(lái)需要配置最重要的內(nèi)容店读,讓客戶端應(yīng)用和CAS服務(wù)連接:
編輯E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\web.xml屯断,在最下面加入如下配置:
<!-- 用于單點(diǎn)退出氧秘,該過(guò)濾器用于實(shí)現(xiàn)單點(diǎn)登出功能丸相,可選配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 該過(guò)濾器用于實(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.zhoubang85.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.zhoubang85.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過(guò)濾器負(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.zhoubang85.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.zhoubang85.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
該過(guò)濾器負(fù)責(zé)實(shí)現(xiàn)HttpServletRequest請(qǐng)求的包裹映琳,比如允許開發(fā)者通過(guò)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>
<!--
該過(guò)濾器使得開發(fā)者可以通過(guò)org.jasig.cas.client.util.AssertionHolder來(lái)獲取用戶的登錄名。比如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的tomcat,在瀏覽器訪問(wèn):
http://client1.zhoubang85.com:18080/examples/servlets/servlet/HelloWorldExample
看看是否跳轉(zhuǎn)到了CAS認(rèn)證界面顶吮,回車之后社牲,會(huì)出現(xiàn)如下圖:
認(rèn)證觀察會(huì)發(fā)現(xiàn)瀏覽器的地址欄中(我用的是火狐瀏覽器),URL信息是這樣的:
https://server.zhoubang85.com:8443/cas/login?service=http%3A%2F%2Fclient1.zhoubang85.com%3A18080%2Fexamples%2Fservlets%2Fservlet%2FHelloWorldExample
我想你已經(jīng)知道什么意思了悴了,由于你沒(méi)有登錄CAS認(rèn)證系統(tǒng)搏恤,CAS認(rèn)證系統(tǒng)攔截到你訪問(wèn)的客戶端應(yīng)用违寿,首先進(jìn)入到認(rèn)證系統(tǒng)登錄界面熟空,同時(shí)URL后面加上你想訪問(wèn)的地址信息藤巢,當(dāng)你登錄成功后,CAS服務(wù)會(huì)轉(zhuǎn)向到你剛剛訪問(wèn)的地址息罗,也就是:
http://client1.zhoubang85.com:18080/examples/servlets/servlet/HelloWorldExample
轉(zhuǎn)向到這個(gè)地址之后掂咒,瀏覽器會(huì)顯示如下內(nèi)容:
上面這個(gè)內(nèi)容,顯示的就是你訪問(wèn)tomcat中的examples項(xiàng)目的一個(gè)servlet的返回結(jié)果迈喉。
這里俏扩,如果你夠細(xì)心的話,你會(huì)發(fā)現(xiàn)瀏覽器地址欄又多了一個(gè)內(nèi)容弊添,即多了一個(gè)jsessionid參數(shù),這個(gè)就是CAS認(rèn)證的原理所在捌木,使用的是COOKIE機(jī)制油坝。這里就不多說(shuō)了。
配置apache-tomcat-7.0.57-client2客戶端2
配置與上面的客戶端配置步驟相同刨裆,其中需要注意的就是澈圈,這第二個(gè)客戶端的tomcat端口要與上面的客戶端和CAS服務(wù)端的端口要不一樣,否則出現(xiàn)端口占用的錯(cuò)誤帆啃。
主要配置如下:
Port修改成28080
Port修改成28009
修改編輯E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\web.xml文件瞬女,加入的內(nèi)容就是上面在第一個(gè)客戶端的web.xml內(nèi)容一致,只不過(guò)需要修改2處內(nèi)容努潘,就是幾個(gè)url地址诽偷, 最終的配置如下:
<!-- 用于單點(diǎn)退出,該過(guò)濾器用于實(shí)現(xiàn)單點(diǎn)登出功能疯坤,可選配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 該過(guò)濾器用于實(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.zhoubang85.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.zhoubang85.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過(guò)濾器負(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.zhoubang85.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.zhoubang85.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
該過(guò)濾器負(fù)責(zé)實(shí)現(xiàn)HttpServletRequest請(qǐng)求的包裹压怠,比如允許開發(fā)者通過(guò)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>
<!--
該過(guò)濾器使得開發(fā)者可以通過(guò)org.jasig.cas.client.util.AssertionHolder來(lái)獲取用戶的登錄名菌瘫。比如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>
測(cè)試驗(yàn)證SSO
至此,2個(gè)客戶端也已經(jīng)配置完畢雨让,啟動(dòng)配置好的三個(gè)tomcat分別為:CAS服務(wù)端tomcat雇盖、2個(gè)客戶端tomcat
我本地路徑分別為:
服務(wù)端tomcat:E:\apache-tomcat-7.0.57
客戶端1:E:\apache-tomcat-7.0.57-client1
客戶端2:E:\apache-tomcat-7.0.57-client2
基本的測(cè)試
訪問(wèn)客戶端1—-> 跳轉(zhuǎn)到cas server 驗(yàn)證 —-> 顯示客戶端1的應(yīng)用 —->新開選項(xiàng)卡訪問(wèn)客戶端2 —-> 顯示客戶端2應(yīng)用 —-> 注銷cas server —-> 打開客戶端1/客戶端2 —-> 重新跳轉(zhuǎn)到cas server 驗(yàn)證.
下面截圖,根據(jù)上面所示進(jìn)行測(cè)試栖忠,看看是否與上面說(shuō)的流程一致:
首先刊懈,打開火狐瀏覽器这弧,地址欄輸入:
http://client1.zhoubang85.com:18080/examples/servlets/servlet/HelloWorldExample
回車,將會(huì)出現(xiàn)CAS認(rèn)證界面:
輸入用戶名和密碼虚汛,登錄成功后匾浪,顯示的界面:
重新打開一個(gè)選項(xiàng)卡,地址欄輸入:
http://client2.zhoubang85.com:28080/examples/servlets/servlet/HelloWorldExample
回車卷哩,將直接顯示客戶端2界面蛋辈,沒(méi)有重新登錄,瀏覽器顯示界面:
根據(jù)上面顯示的界面将谊,按照普通想邏輯冷溶,當(dāng)訪問(wèn)客戶端2的時(shí)候,應(yīng)該會(huì)被CAS攔截尊浓,轉(zhuǎn)到CAS認(rèn)證服務(wù)的界面逞频,但是結(jié)果卻直接顯示客戶端2的界面,原因就是因?yàn)槟阍谠L問(wèn)客戶端1的時(shí)候已經(jīng)登錄認(rèn)證過(guò)了栋齿,CAS會(huì)在你瀏覽器中注入COOKIE苗胀,記錄你的認(rèn)證憑證,如果你的瀏覽器沒(méi)有關(guān)閉或者退出的話瓦堵,當(dāng)你訪問(wèn)客戶端2應(yīng)用的時(shí)候基协,CAS檢測(cè)到認(rèn)證的憑證,所以菇用,就直接顯示了客戶端2的界面澜驮,大概的認(rèn)證處理流程就是這樣了,我這里說(shuō)的比較淺顯惋鸥,其實(shí)CAS還是有很多更加復(fù)雜的操作在里面的杂穷,有興趣的朋友自己慢慢研究吧。
這里卦绣,其實(shí)就已經(jīng)說(shuō)明亭畜,CAS單點(diǎn)登錄系統(tǒng)已經(jīng)搭建完畢!運(yùn)行一切正常迎卤!
下面拴鸵,我們新打開一個(gè)選項(xiàng)卡(也可在當(dāng)前頁(yè)面的地址欄輸入),在瀏覽器地址欄中輸入
https://server.zhoubang85.com:8443/cas/logout
回車顯示:

上述表示 認(rèn)證注銷成功蜗搔,此時(shí)如果再訪問(wèn) :
http://client1.zhoubang85.com:18080/examples/servlets/servlet/HelloWorldExample
或
http://client2.zhoubang85.com:28080/examples/servlets/servlet/HelloWorldExample
都將會(huì)跳轉(zhuǎn)到CAS服務(wù)重新進(jìn)行認(rèn)證劲藐。
【異常錯(cuò)誤總結(jié)】:
1、如果中途出現(xiàn)了以下異常錯(cuò)誤:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
原因分析:其實(shí)原因就是樟凄,你在上面的第5步進(jìn)行證書導(dǎo)入到j(luò)re證書鏈的時(shí)候(具體命令如下:keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file c:\ssodemo.crt -alias ssodemo)聘芜,ssodemo.crt路徑不對(duì)導(dǎo)致,檢查下下c:\ssodemo.crt否有空格缝龄,或者回想下是否執(zhí)行了這個(gè)步驟汰现。
到此挂谍,SSO之CAS單點(diǎn)登錄系統(tǒng)已經(jīng)搭建完畢!
這里我借鑒一篇文章瞎饲,提供大家學(xué)習(xí):
http://www.micmiu.com/enterprise-app/sso/sso-cas-sample/
當(dāng)然口叙,CAS認(rèn)證之后,至于在后臺(tái)如何獲取到登錄的用戶信息嗅战,這里我就不作描述了妄田。上面分享的文章最后有相應(yīng)的講解。其他的知識(shí)驮捍,自己慢慢學(xué)習(xí)和研究吧疟呐。
歡迎訪問(wèn) JAVA技術(shù)分享 www.2b2b92b.com