ubuntu 18.04安裝CAS 5.3全記錄

      網友投稿 1059 2022-05-30

      注:本文初次發布于 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=113841&page=1&authorid=70062 ,是《云享讀書會》第九期《深入淺出Spring Security》讀書筆記的一部分,因能獨立成文,特發出來給大家參考。

      一、CAS概念的引出

      企業在建設IT系統時,往往會不斷地擴充應用系統,以提高自身的業務能力,這些系統原先一般都有自己的登錄模塊。這就會造成系統增多之后,業務人員在操作各個系統時,極其不方便——在A系統(app1.my.com)登錄一次,再在B系統(app2.my.com)登錄一次。

      這時,我們會在架構上做如下的調整:專門拉出一個系統(sso.my.com)——不做業務,只做登錄;而其他系統——只做業務,不做登錄。當后者(如app1.my.com)需要登錄時,跳轉到前面sso.my.com完成登錄,就表示后者(如app1.my.com)完成了登錄。也就是說,登錄僅僅在一個系統(sso.my.com)中完成——顧名思義,稱之為“單點登錄”(Single Sing On,即SSO)。

      而用戶在瀏覽器輸入完用戶名和密碼,提供單點服務的sso.my.com服務端會在內存中生成一個用戶session(jsessionid),并在這個session中記錄“已登錄”狀態,同時,如果使用cookie的話,會在瀏覽器寫入Cookie(Set-Cookie:SessionID:xxx).這個Cookie也會成為用戶的標識。

      用戶如果接著做進行業務操作,所有的請求會帶著這個Cookie,服務端就會根據這個Cookie中的sessionId找到對應的用戶Session,并根據Session的狀態判斷該用戶是否已登錄。

      SSO包含同一個域下的單點登錄和不同域下的單點登錄。同一個域下的多個系統,由于Cookie不能跨域,我們可以將Cookie的域設置成my.com。這樣所有子域的系統都可以訪問my.com的Cookie。可以通過共享session(如Spring Session)的方式保證同一個用戶在不同系統的sessionid一致,但這還不是真實意義的單點登錄。

      這里就引出一個CAS概念。CAS是Central Authentication Service,意思為中央驗證服務。CAS由CAS Server和CAS Client組成。CAS中有幾個概念:Ticket Granting Ticket(TGT)、Ticket Granted Cookie(TGC)和Service Ticket(ST)。其中:

      (1)TGT類似于服務器Session,是用戶登錄的票根,包含用戶認證身份以及有效期等等,存放在CAS Server中。

      (2)TGC類似于會話ID,是存在Cookie中的一段數據,瀏覽器在跟CAS Server交互時,TGC可以幫助找到對應的TGT。

      (3)ST是CAS Server簽發的一次性票據。CAS Client使用ST跟CAS Server進行交互,獲得用戶的登錄狀態。

      CAS的流程如下:

      用戶訪問CAS Client的某個頁面,如app1.my.com/hello

      CAS Client判斷用戶沒有登錄,會返回302狀態碼,指示瀏覽器重定向 如http://sso.my.com?service=app1.my.com/hello.在這里,service賦值為第一步的原訪問地址。

      瀏覽器攜帶service重定向到CAS Server。

      CAS Server獲取Cookie中的的TGC,并以此查找TGT。如果找到,則認證完成。否則,會重定向到CAS Server的登錄頁面,如http://sso.my.com/login?service=app1.my.com/hello

      用戶在登錄頁面錄入用戶名,密碼,點擊登錄。首次登錄,CAS Server會生成TGT。每次驗證時,CAS Server會根據TGT簽發一個ST。將ST拼接在service中,并將TGC設置到用戶Cookie中(域為sso.my.com)。并返回302狀態碼,指示瀏覽器重定向:http://app1.my.com/hello?ticket=xxx

      瀏覽器將TGC寫入的Cookie,并攜帶ticket(即ST)重定向到service即app1.my.com/hello的原業務頁面。

      app1(CAS Client)拿到ticket,向CAS Server驗證ticket的有效性

      如果CAS Server驗證是有效的,會告知CAS Client該ticket有效,并返回用戶信息。

      app1將登錄狀態寫入session,設置app1.my.com域下的cookie。

      此時,如果用戶訪問另一個系統 app2.my.com,流程如下:

      用戶訪問CAS Client的某個頁面,如app2.my.com/hello

      CAS Client判斷用戶沒有登錄,會返回302狀態碼,指示瀏覽器重定向 如http://sso.my.com?service=app2.my.com/hello,在這里,service賦值為第一步的原訪問地址。

      瀏覽器攜帶service重定向到CAS Server。

      CAS Server獲取Cookie中的的TGC,并以此查找TGT。此時因為用戶在瀏覽器登錄過,所以已經找到了。CAS Server會根據TGT簽發一個ST,將ST拼接在service中,并返回302狀態碼,指示瀏覽器重定向:http://app2.my.com/hello?ticket=xxx

      瀏覽器并攜帶ticket(即ST)重定向到service即app2.my.com/hello的原業務頁面。

      app2(CAS Client)拿到ticket,向CAS Server驗證ticket的有效性

      如果CAS Server驗證是有效的,會告知CAS Client該ticket有效,并返回用戶信息。

      app2將登錄狀態寫入session,設置app2.my.com域下的cookie。

      (上圖來自 https://blog.csdn.net/A_art_xiang/article/details/107028456 )

      從以上的流程可以看出,用戶在sso.my.com登錄時,業務系統并不知道這件事情。所以需要業務系統app1或app2在拿到ticket之后,到CAS Server驗證這個ST是否有效,如果有效才能被訪問。

      二、CAS 5.3的搭建

      CAS Server的5以前的版本,使用的是jdk11+SpringBoot2;而CAS的6版本,使用的是jdk1.8+SpringBoot1。考慮到新版本還得搞Java 11.有點復雜,張小白還是決定安裝CAS Server 5。

      CAS的服務端搭建有2種方式,一個是使用源碼構建,一個是使用WAR overlay的方式安裝。CAS可以在Windows搭建,也可以在Linux搭建。這里選用了張小白熟悉的ubuntu 18.04(這個系統可以玩Atlas 200DK,也可以玩MindSpore,多玩一個系統應該也不是事兒)

      1.準備軟件包

      打開?https://www.apereo.org/projects/cas?網頁,

      點擊Download,會進入?https://github.com/apereo/cas?頁面:

      眾所周知,這個頁面很難打開。

      我們需要利用?http://ipaddress.com

      將github.com加入 C:\Windows\System32\drivers\etc\HOSTS 文件

      再刷新DNS緩存:

      再次打開github頁面:

      我們可以從官網下載相關的軟件包,也可以自行準備,包含以下:

      jdk1.8.0

      apache-tomcat-8.5

      apache-maven-3.5.3

      cas-overlay-template-master

      (前3個應該都能很容易下載到,最后一個如果需要需要的話,可以與我聯系)。

      將相關的軟件包下載后,傳入ubuntu系統(IP:192.168.40.133),并解壓到 /home/cas/cas5.3的目錄(目的可以自行調整)

      編輯/etc/profile,并source使其生效:

      可檢查解壓后的java和mvn版本:

      2.tomcat啟動與處理

      先裸啟tomcat

      瀏覽器訪問tomcat:

      好像啟動沒啥問題。

      下面開始制作tomcat的證書,以便使tomcat支持https訪問。

      生成server.keystore

      keytool -genkey -alias tomcat -keyalg RSA -keypass tomcat -storepass tomcat -keystore server.keystore -validity 3600

      這里面請注意一個細節,在系統詢問“What is your first and last name?”的時候,記得這時輸入CAS服務器的域名,也就是你規劃好的SSO服務器的域名。否則,在CAS客戶端連接后會報錯。

      生成證書

      keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass tomcat

      導入證書:

      keytool -import -trustcacerts -alias tomcat -keystore "/home/cas/cas5.3/jdk1.8.0_171/jre/lib/security/cacerts" -file "/home/cas/cas5.3/apache-tomcat-8.5.31/server.cer" -storepass changeit

      修改tomcat的配置文件server.xml(注意看截圖中的路徑)

      找到?org.apache.coyote.http11.Http11NioProtocol http1.1的那段代碼,做如下修改:

      重啟tomcat

      再打開?https://192.168.40.133:8443/ 端口:(這是SSH端口,所以協議換成了https協議)

      點擊“高級”,然后繼續前往即可。

      也可以出現tomcat首頁。

      3、安裝cas 5.3

      修改pom.xml文件,將cas.version改為5.3.0:(其實也可以改為別的5版本)

      做mvn install(如果編譯出了問題,可以先做mvn clean,再做mvn install)

      耐心等待下載和編譯完畢:

      。。

      編譯成功了,在target目錄下生成了一個cas.war文件,將war包拷貝到tomcat的webapps下:

      看tomcat的日志catalina.out,說明CAS已經啟動:

      用瀏覽器打開?https://192.168.40.133:8443/cas/login 。

      輸入CAS Sever缺省的用戶名密碼:casuser/Mellon:

      點擊登錄按鈕:

      可見CAS 5.3的服務器已經成功搭建。

      4、讓cas 5.3使用MySQL存儲用戶名和密碼

      如果要調整CAS的密碼機制為讀取數據庫,還是需要安裝MySQL,并且配置cas server的數據庫配置。

      MySQL安裝

      apt-get install mysql-server

      mysql_secure_installation

      檢查mysql狀態

      如果要允許root遠程登錄(不推薦),還需要完成以下操作:

      mysql -u root -p

      編輯/etc/mysql/my.cnf

      讓CAS增加數據庫配置:

      建立dep目錄并編輯pom.xml文件:

      執行?mvn -f pom.xml dependency:copy-dependencies 下載數據庫鏈接的依賴包

      。。。

      將編譯好的jar包拷貝到tomcat webapps下的cas/WEB-INF/lib目錄下

      修改?/home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties文件,在最后一段認證配置中做以下修改:

      ## # CAS Authentication Credentials # #cas.authn.accept.users=casuser::Mellon #配置數據庫連接 cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false #數據庫用戶名 cas.authn.jdbc.query[0].user=root #數據庫密碼 cas.authn.jdbc.query[0].password=mysql #mysql驅動 cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver #添加jdbc認證 cas.authn.jdbc.query[0].sql=SELECT * FROM login WHERE login_name =? #哪個字段作為密碼字段 cas.authn.jdbc.query[0].fieldPassword=login_password #哪個字段作為過期字段 0:未過期 1:已過期 cas.authn.jdbc.query[0].fieldExpired=expired #哪個字段作為是否可用字段 0:未禁用 1:已禁用 cas.authn.jdbc.query[0].fieldDisabled=disabled #配置加密策略 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

      請注意mysql連接串如果不加

      serverTimezone=UTC

      ubuntu 18.04安裝CAS 5.3全記錄

      可能會報錯。

      在mysql建個casdb數據庫

      create database casdb;

      并建立ogin表:

      插入2條數據:

      重啟tomcat

      再重新打開頁面: https://192.168.40.133:8443/cas/login

      輸入:test? ?密碼:123456? ?(普通md5)可以正常登錄。

      從后臺日志也可以看出:CAS驗證成功并發了ticket。

      用戶密碼的密文生成:

      大家肯定有疑問,login表中login_password密碼字段的那串密文是怎么得來的呢?張小白介紹一下:

      建一個Maven工程,用來生成加密鹽的密碼:

      把計算出的結果更新mysql數據庫的login表:

      再在/home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties 中增加第二種認證策略,策略中的Salt、加密算法等保證跟前面計算密碼密文的一致。

      #數據庫連接 cas.authn.jdbc.encode[0].driverClass=com.mysql.cj.jdbc.Driver cas.authn.jdbc.encode[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false cas.authn.jdbc.encode[0].user=root cas.authn.jdbc.encode[0].password=mysql #加密迭代次數 cas.authn.jdbc.encode[0].numberOfIterations=2 #該列名的值可替代上面的值,但對密碼加密時必須取該值進行處理 cas.authn.jdbc.encode[0].numberOfIterationsFieldName= #動態鹽值用的字段 cas.authn.jdbc.encode[0].saltFieldName=login_name #靜態鹽值 cas.authn.jdbc.encode[0].staticSalt=654321 cas.authn.jdbc.encode[0].sql=SELECT * FROM login WHERE login_name =? #對處理鹽值后的算法 cas.authn.jdbc.encode[0].algorithmName=MD5 #哪個字段作為密碼字段 cas.authn.jdbc.encode[0].passwordFieldName=login_password #哪個字段作為過期字段 0:未過期 1:已過期 cas.authn.jdbc.encode[0].expiredFieldName=expired #哪個字段作為是否可用字段 0:未禁用 1:已禁用 cas.authn.jdbc.encode[0].disabledFieldName=disabled

      再重啟tomcat

      打開頁面https://192.168.40.133:8443/cas/login?,

      輸入 用戶名admin ,密碼123456登錄

      終于也可以成功登錄了。

      看一下后臺日志catalina.out,確實是admin用戶成功登陸了。

      從上面可以看出,盡管2個用戶的密碼都是123456,但是一個是簡單的MD5加密,一個是加了鹽的MD5加密,所以密文是不一樣的。

      當然,如果在瀏覽器輸入:https://192.168.40.133:8443/cas/logout

      可以把登錄的用戶注銷。

      后臺日志也顯示這個ticket被銷毀了:

      至此,CAS Server總算搭建完成了。

      當然,CAS Server需要CAS Client的配合才能完整使用。這點張小白還在嘗試之中。本文暫時不談CAS Client的問題。有興趣的人可以看下張小白讀書筆記的最后一段內容研究下。

      參考資料:

      1.單點登錄(SSO)看這一篇就夠了?https://www.jianshu.com/p/75edcc05acfd

      2.關于JSESSIONID?https://www.jianshu.com/p/f2e5db637ed4

      3.Spring Security基于JWT實現SSO單點登錄?https://blog.csdn.net/qq_36144258/article/details/79425942

      4.CAS-搭建CAS Server服務端(靜態認證)??https://my.oschina.net/u/4335103/blog/4535512

      5. CAS server6.x配置與部署筆記?https://blog.csdn.net/hy9418/article/details/107104177/

      6. CAS單點登錄學習筆記--CAS Server搭建(一)https://blog.csdn.net/polo_longsan/article/details/91391272

      7. 輕松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER 服務端?https://blog.csdn.net/weixin_39206782/article/details/80659033

      8. CAS5.3單點登錄(一)服務器搭建?https://blog.csdn.net/zzy730913/article/details/80796716

      9. CentOS安裝CAS 5.3.4服務端?https://www.cnblogs.com/kgdxpr/p/9854657.html

      10.?終于把單點登錄完整流程圖畫明白了!史上最完整的CAS單點登錄完整圖解!https://blog.csdn.net/A_art_xiang/article/details/107028456

      (全文完,謝謝閱讀)

      https Spring Boot Tomcat Ubuntu 軟件安全

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:鯤鵬撬動多元新架構,華為云業務正進入發展快車道
      下一篇:新手語音入門(四): 傳統語音識別技術簡介 | 隱馬爾可夫鏈 | 聲學/語言模型 | WFST解碼
      相關文章
      日韩亚洲国产高清免费视频| 亚洲a∨无码男人的天堂| 7777久久亚洲中文字幕| 亚洲黄色在线电影| 亚洲av午夜福利精品一区| 亚洲欭美日韩颜射在线二| 久久亚洲av无码精品浪潮| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲精品国产精品国自产观看| 亚洲爆乳AAA无码专区| 亚洲色偷偷综合亚洲av78| 亚洲乱码日产精品一二三| 亚洲中文字幕无码久久2020| 亚洲中文字幕无码久久2020 | 亚洲国产精品成人久久| 亚洲成A人片在线观看无码不卡| 国产亚洲精品一品区99热| 亚洲国产精品无码专区| 亚洲AV人无码激艳猛片| 亚洲高清在线观看| 7777久久亚洲中文字幕蜜桃| 亚洲图片激情小说| 亚洲 欧洲 自拍 另类 校园| 亚洲国产精品美女久久久久| 国产综合成人亚洲区| 亚洲情a成黄在线观看| 九月丁香婷婷亚洲综合色| 亚洲AV乱码久久精品蜜桃| 亚洲综合自拍成人| 亚洲国产精品综合福利专区| 色噜噜亚洲男人的天堂| 亚洲成a∧人片在线观看无码 | 91大神亚洲影视在线| 亚洲av日韩av无码av| 亚洲精品无码久久| 亚洲黄片毛片在线观看| 国产亚洲福利精品一区| 久久久亚洲欧洲日产国码aⅴ| 亚洲国产模特在线播放| 亚洲国产日韩a在线播放| 亚洲第一成人影院|