Shiro学习(15)单点登录
Shiro 1.2開始提供了Jasig CAS單點(diǎn)登錄的支持,單點(diǎn)登錄主要用于多系統(tǒng)集成,即在多個(gè)系統(tǒng)中,用戶只需要到一個(gè)中央服務(wù)器登錄一次即可訪問這些系統(tǒng)中的任何一個(gè),無須多次登錄。此處我們使用Jasig CAS v4.0.0-RC3版本:
https://github.com/Jasig/cas/tree/v4.0.0-RC3
?
Jasig CAS單點(diǎn)登錄系統(tǒng)分為服務(wù)器端和客戶端,服務(wù)器端提供單點(diǎn)登錄,多個(gè)客戶端(子系統(tǒng))將跳轉(zhuǎn)到該服務(wù)器進(jìn)行登錄驗(yàn)證,大體流程如下:
1、訪問客戶端需要登錄的頁面http://localhost:9080/ client/,此時(shí)會跳到單點(diǎn)登錄服務(wù)器https://localhost:8443/ server/login?service=https://localhost:9443/ client/cas;
2、如果此時(shí)單點(diǎn)登錄服務(wù)器也沒有登錄的話,會顯示登錄表單頁面,輸入用戶名/密碼進(jìn)行登錄;
3、登錄成功后服務(wù)器端會回調(diào)客戶端傳入的地址:https://localhost:9443/client/cas?ticket=ST-1-eh2cIo92F9syvoMs5DOg-cas01.example.org,且?guī)е粋€(gè)ticket;
4、客戶端會把ticket提交給服務(wù)器來驗(yàn)證ticket是否有效;如果有效服務(wù)器端將返回用戶身份;
5、客戶端可以再根據(jù)這個(gè)用戶身份獲取如當(dāng)前系統(tǒng)用戶/角色/權(quán)限信息。
?
本章使用了和《第十四章?SSL》一樣的數(shù)字證書。
?
服務(wù)器端
我們使用了Jasig CAS服務(wù)器v4.0.0-RC3版本,可以到其官方的github下載:https://github.com/Jasig/cas/tree/v4.0.0-RC3下載,然后將其cas-server-webapp模塊封裝到shiro-example-chapter15-server模塊中,具體請參考源碼。
?
1、數(shù)字證書使用和《第十四章?SSL》一樣的數(shù)字證書,即將localhost.keystore拷貝到shiro-example-chapter15-server模塊根目錄下;
?
2、在pom.xml中添加Jetty Maven插件,并添加SSL支持:
Java代碼???
3、修改src/main/webapp/WEB-INF/deployerConfigContext.xml,找到primaryAuthenticationHandler,然后添加一個(gè)賬戶:
Java代碼??其也支持如JDBC查詢,可以自己定制;具體請參考文檔。
?
4、mvn jetty:run啟動服務(wù)器測試即可:
訪問https://localhost:8443/chapter15-server/login將彈出如下登錄頁面:
?
輸入用戶名/密碼,如zhang/123,將顯示登錄成功頁面:
?
到此服務(wù)器端的簡單配置就完成了。?
?
?
客戶端
1、首先使用localhost.keystore導(dǎo)出數(shù)字證書(公鑰)到D:\localhost.cer
Java代碼???
2、因?yàn)镃AS client需要使用該證書進(jìn)行驗(yàn)證,需要將證書導(dǎo)入到JDK中:?
Java代碼??如果導(dǎo)入失敗,可以先把security?目錄下的cacerts刪掉;?
?
3、按照服務(wù)器端的Jetty Maven插件的配置方式配置Jetty插件;
?
4、在shiro-example-chapter15-client模塊中導(dǎo)入shiro-cas依賴,具體請參考其pom.xml;?
?
5、自定義CasRealm:
Java代碼??CasRealm根據(jù)CAS服務(wù)器端返回的用戶身份獲取相應(yīng)的角色/權(quán)限信息。?
?
?
6、spring-shiro-web.xml配置:
Java代碼??casServerUrlPrefix:是CAS Server服務(wù)器端地址;
casService:是當(dāng)前應(yīng)用CAS服務(wù)URL,即用于接收并處理登錄成功后的Ticket的;
?
如果角色/權(quán)限信息是由服務(wù)器端提供的話,我們可以直接使用CasRealm:?
Java代碼??defaultRoles/ defaultPermissions:默認(rèn)添加給所有CAS登錄成功用戶的角色和權(quán)限信息;
roleAttributeNames/ permissionAttributeNames:角色屬性/權(quán)限屬性名稱,如果用戶的角色/權(quán)限信息是從服務(wù)器端返回的(即返回的CAS Principal中除了Principal之外還有如一些Attributes),此時(shí)可以使用roleAttributeNames/ permissionAttributeNames得到Attributes中的角色/權(quán)限數(shù)據(jù);請自行查詢CAS獲取用戶更多信息。
?
Java代碼??CasFilter類似于FormAuthenticationFilter,只不過其驗(yàn)證服務(wù)器端返回的CAS Service Ticket。?
?
Java代碼??loginUrl:https://localhost:8443/chapter15-server/login表示服務(wù)端端登錄地址,登錄成功后跳轉(zhuǎn)到?service參數(shù)對于的地址進(jìn)行客戶端驗(yàn)證及登錄;
“/cas=cas”:即/cas地址是服務(wù)器端回調(diào)地址,使用CasFilter獲取Ticket進(jìn)行登錄。
?
7、測試,輸入http://localhost:9080/chapter15-client地址進(jìn)行測試即可,可以使用如Chrome開這debug觀察網(wǎng)絡(luò)請求的變化。
?
如果遇到以下異常,一般是證書導(dǎo)入錯(cuò)誤造成的,請嘗試重新導(dǎo)入,如果還是不行,有可能是運(yùn)行應(yīng)用的JDK和安裝數(shù)字證書的JDK不是同一個(gè)造成的:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
?????? at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:385)
?????? at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
?????? at sun.security.validator.Validator.validate(Validator.java:260)
?????? at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
?????? at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
?????? at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
?????? at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
?????? ... 67 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
?????? at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
?????? at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
?????? at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
?????? ... 73 more
??????
?
轉(zhuǎn)載于:https://www.cnblogs.com/guoziyi/p/7131167.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Shiro学习(15)单点登录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】Python基础
- 下一篇: 动态代理案例1:运用Proxy动态代理来