參考連接:https://blog.csdn.net/qq_34021712/article/details/81318649 ©王賽超
https://blog.csdn.net/u010475041/article/details/78094251html
大神超厲害,小菜鳥表示很崇拜java
casServer:https://mmoayyed.unicon.net:8443/cas/loginweb
casClient1:http://localhost:8080數據庫
casClient2:http://localhost:8082瀏覽器
協議流程:
1. 若業務系統未登陸,302到https://mmoayyed.unicon.net:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F
2. 用戶提交用戶名密碼後,302到http://localhost:8080/?ticket=ST-14-pMSfaxuaq1tMmRccck4i9egxM4kDESKTOP-NEPM8G8
3. 業務系統驗證ticket,並獲取用戶數據,https://mmoayyed.unicon.net:8443/cas/serviceValidate?service=p3/serviceValidate?service&ticket=ABC123
4. 成功獲取用戶數據
服務器
其實咱們只關心兩個階段,其餘都交給cas client去完成:
1. 請求的路徑是否須要跳轉到登陸頁
2. 回來的用戶是否能訪問被請求資源java-web
客戶端:http://localhost:8080/session
因爲該鏈接沒有service,因此重定向到登錄界面 app
<filter> <!--ApplicationFilterConfig[name=CAS Filter, filterClass=org.jasig.cas.client.authentication.AuthenticationFilter]--> <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://mmoayyed.unicon.net:8443/cas/login</param-value> <!-- 使用的CAS-Server的登陸地址,必定是到登陸的action --> <!--https://cas.server.name:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F--> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080/cas-sample-java-webapp</param-value> <!-- 當前Client系統的地址 --> </init-param> </filter>
此時登錄界面的地址路徑爲:https://mmoayyed.unicon.net:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fcas-sample-java-webapp%2Findex.jspwebapp
該圖示重定向以後的界面和路徑
cas server本來的登錄界面路徑爲:https://mmoayyed.unicon.net:8443/cas/login
截圖以下:
總結:兩者的區別就是用戶第一次訪問app時,去cas認證中心的過程,CAS Filter攔截器會查看url有無service,參考cas驗證流程
此時,輸入用戶名,密碼驗證經過
此時點擊登錄後會進入cas的認證系統,默認的用戶名密碼,此處已經改成從數據庫user表進行驗證,主要方法是extends AbstractPreAndPostProcessingAuthenticationHandler,這個類用於有多個屬性字段提交的狀況
驗證經過後,app所在界面進行跳轉,顯示用戶登錄成功
此時瀏覽器輸入 http://localhost:8082/cas-sample-java-webapp 訪問客戶端2
以下界面表示登錄成功。
查看cas server ;client1(8080端口);client2(8082)的JSESSIONID,爲流程走代碼做參考
能夠知道:登錄成功後, ticket保存在cas server服務器端,除此以外下面的問題說明cas會加在客戶端訪問url後面返回
此時客戶端會向cas server提交ticket進行驗證,
<filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://mmoayyed.unicon.net:8443/cas</param-value> <!-- 使用的CAS-Server的地址,必定是在瀏覽器輸入該地址能正常打開CAS-Server的根地址 --> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080/cas-sample-java-webapp</param-value> <!-- 當前Client系統的地址 --> </init-param> </filter>
org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter
public class Cas30ProxyReceivingTicketValidationFilter extends Cas20ProxyReceivingTicketValidationFilter { public Cas30ProxyReceivingTicketValidationFilter() { super(Protocol.CAS3); this.defaultServiceTicketValidatorClass = Cas30ServiceTicketValidator.class; this.defaultProxyTicketValidatorClass = Cas30ProxyTicketValidator.class; } }
public class Cas30ServiceTicketValidator extends Cas20ServiceTicketValidator { public Cas30ServiceTicketValidator(String casServerUrlPrefix) { super(casServerUrlPrefix); } @Override protected String getUrlSuffix() { return "p3/serviceValidate"; } }
serviceValidate這個接口傳入ticket,service參數,驗證有效性
成功後,用戶信息寫入web應用的sessio裏。
至此,session會話創建結束。
下面是遇到的問題
NO1.在輸入用戶名,密碼提交後出現如下界面如:此時app訪問路徑爲 http://localhost:8080/?ticket=ST-14-pMSfaxuaq1tMmRccck4i9egxM4kDESKTOP-NEPM8G8
能夠看到此時咱們的用戶已經經過驗證,帶着屬於本身的憑據ticket返回----(這是沒有修復以前的問題截圖)
而用戶是否登錄呢?
能夠看到cas server的web界面已經進入到登錄成功的界面
在此基礎上,點擊退出以後,訪問http://localhost:8081/ 則會進入https://cas.server.name:8443/cas/login?service=http%3A%2F%2Fapp1.cas.com%3A8081%2F 從新驗證登錄
對於上面出顯得問題,作出的調整是:將主機名省去,改成默認的localhost,則訪問主機名的問題修復
No2.
這個問題的緣由在於:搭建cas server服務器的時候,第一步是證書的配置,參考 https://blog.csdn.net/yelllowcong/article/details/78778452
而個人cas server則用的不是本身建立的證書,我選擇的證書是官網下載下來的cas server壓縮包解壓後的cas-overlay-template-master\etc\cas\thekeystore證書,https://www.cnblogs.com/ljangle/p/10038214.html
那麼這個證書對於搭建客戶端的關鍵是什麼呢?
主要就是圖片圈出的,而我理解不透徹,就對本身啓動的cas server隨便起了一個域名,雖然cas server啓動了,可是在接入客戶端的時候就栽了跟頭。
那cas server自帶的證書是什麼樣呢?
就是這個下圖的內容,相應的,若是不想換證書,就把域名改一下,這樣dns才能夠在本地hosts文件找到對應的ip,不然就找不到。
到此並無結束,因爲我下載的cas server是6.0版本的,也就是隻支持jdk11,而個人客戶端項目是jdk1.8版本的,那麼這個證書爲何會讓二者有關聯呢?
就是證書導入jdk1.8中;介於我是一個小菜鳥,還不知道怎麼把證書加入到jdk11中,可是證書加入jdk1.8就是大把的教程,證書加入1.8底層原理不清楚,可是最終的目的就是讓客戶端在服務器驗證登錄的時候,能夠知道域名與ip之間的映射關係,注意客戶端的jdk要選擇證書嵌入的jdk,不然會出現unable to find valid certification path to requested target
至此,maven web 的客戶端與cas server的服務器驗證就完成了
歡迎指教,只懂java se的仙女表示我盡力了
有一個問題是個人登錄成功界面沒有;jsessionid=3EFAC76F253826DB83F73C8EC7432D10,估計哪裏沒有配置好,下次改