Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美成人性色xxxxx视频大,大香焦伊人网,最近中文字幕最新2019免费

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          單點登錄的CAS實踐

          、在談項目實踐之前,先說兩個概念:

          (1)ruoyi-vue:采用前后端分離的單體web框架,參見介紹 | RuoYi,使用MIT開源協(xié)議,對商業(yè)使用友好。

          (2)CAS:英文為Central Authentication Service,即中央認(rèn)證服務(wù),為耶魯大學(xué)發(fā)起的一個開源項目,是實現(xiàn)sso單點登錄的框架。官網(wǎng)地址:https://www.apereo.org/projects/cas。關(guān)于spring secuity集成cas可參考:https://docs.spring.io/spring-security/site/docs/5.4.1/reference/html5/#servlet-cas。

          CAS官方架構(gòu):https://apereo.github.io/cas/development/planning/Architecture.html。

          CAS架構(gòu)圖

          CAS執(zhí)行邏輯:CAS分CAS Server和CAS Client。其中CAS Server用于分發(fā)和驗證tickets,CAS Client從CAS Server檢索授權(quán)用戶的身份。

          時序圖參見:https://apereo.github.io/cas/development/protocol/CAS-Protocol.html。

          (1)訪問服務(wù): SSO 客戶端發(fā)送請求訪問應(yīng)用系統(tǒng)。

          (2)定向認(rèn)證: SSO 客戶端重定向請求到 CAS服務(wù)器。

          (3)用戶認(rèn)證:用戶身份認(rèn)證。

          (4)發(fā)放票據(jù): 成功登錄后,CAS服務(wù)器向用戶發(fā)放TGT(ticket-granting ticket)全局票據(jù),創(chuàng)建SSO會話。Server端是TGT,Client端是TGC(Ticket Granted Cookie),類似于session和cookie。同時TGT簽發(fā)一個ST返回給瀏覽器(如不同應(yīng)用請求,發(fā)現(xiàn)TGC對應(yīng)了一個TGT,同樣會簽發(fā)ST)。

          (5)驗證票據(jù): CAS服務(wù)器驗證票據(jù) Service Ticket (ST)的合法性,驗證通過后,允許客戶端訪問服務(wù)。ST作為Url中的get參數(shù)傳遞。

          (6)傳輸用戶信息:CAS服務(wù)器驗證票據(jù)通過后,傳輸用戶認(rèn)證結(jié)果信息給客戶端。

          CAS執(zhí)行邏輯圖

          二、回到正題,如何在ruoyi-vue(3.8.1)項目中集成CAS呢。由于ruoyi-vue基于spring seruity。需集成spring-security-cas依賴。另外認(rèn)證要增加和CAS服務(wù)端的集成。

          本文參考:RuoYi-Vue前后端分離版集成cas_GGX-520的博客-CSDN博客_ruoyi分離版cas

          后端集成:

          1、common模塊添加對CAS的支持。

          <!-- 添加spring security cas支持 -->
          <dependency>
              <groupId>org.springframework.security</groupId>
              <artifactId>spring-security-cas</artifactId>
          </dependency>

          2、配置文件修改

          #CAS
          cas:
            server:
              host:
                #CAS服務(wù)地址
                url: http://localhost:8888/cas
                #CAS服務(wù)登錄地址
                login_url: ${cas.server.host.url}/login
                #CAS服務(wù)登出地址
                logout_url: ${cas.server.host.url}/logout?service=${app.server.host.url}
          # 應(yīng)用訪問地址
          app:
            #開啟cas
            casEnable: true
            server:
              host:
                url: http://localhost:${server.port}
            #應(yīng)用登錄地址
            login_url: /
            #應(yīng)用登出地址
            logout_url: /logout
            #前端登錄地址
            web_url: http://localhost/

          3、修改LoginUser.java

          由于CAS認(rèn)證需要authorities屬性,在common模塊中直接new HashSet():

          @Override
          public Collection<? extends GrantedAuthority> getAuthorities()
          {
              return new HashSet();
          }

          4、在common模塊中修改Constants.java

          /**
           * CAS登錄成功后的后臺標(biāo)識
           */
          public static final String CAS_TOKEN = "cas_token";
          
          /**
           * CAS登錄成功后的前臺Cookie的Key
           */
          public static final String WEB_TOKEN_KEY = "Admin-Token";

          5、在framework模塊config.properties下新增CasProperties.java

          CasProperties代碼

          6、在framework模塊web.service下新增CasUserDetailsService.java

          CasUserDetailService代碼

          7、在framework模塊security.handle下添加CasAuthenticationSuccessHandler.java

          CasAuthenticationSuccessHandler代碼

          8、在framework模塊config.SecurityConfig下修改SecurityConfig。(setCasServerUrlPrefix 從cas-client 3.6.0已移除)

          SecurityConfig代碼

          前端集成:

          1、修改settings.js

          settings.js代碼

          2、修改permission.js,判斷沒有token時訪問cas登錄頁面

          permission.js 代碼

          3、修改request.js、Navbar.vue,登出后不做響應(yīng)

          request.js代碼

          Navbar.vue代碼

          4、修改user.js,登出后跳轉(zhuǎn)到cas登出頁面

          user.js代碼

          另外CAS Server需另外搭建。地址為:https://github.com/apereo/cas/releases/

          JDK 5之前Java語言是靠synchronized關(guān)鍵字保證同步的,這會導(dǎo)致有鎖

          • 鎖機(jī)制存在以下問題:

          (1)在多線程競爭下,加鎖、釋放鎖會導(dǎo)致比較多的上下文切換和調(diào)度延時,引起性能問題。

          (2)一個線程持有鎖會導(dǎo)致其它所有需要此鎖的線程掛起。

          (3)如果一個優(yōu)先級高的線程等待一個優(yōu)先級低的線程釋放鎖會導(dǎo)致優(yōu)先級倒置,引起性能風(fēng)險。

          volatile是不錯的機(jī)制,但是volatile不能保證原子性。因此對于同步最終還是要回到鎖機(jī)制上來。

          獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,會導(dǎo)致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。而另一個更加有效的鎖就是樂觀鎖。所謂樂觀鎖就是,每次不加鎖而是假設(shè)沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。樂觀鎖用到的機(jī)制就是CAS,Compare and Swap。

          一、什么是CAS

          CAS,compare and swap的縮寫,中文翻譯成比較并交換。

          CAS的語義是“我認(rèn)為V的值應(yīng)該為A,如果是,那么將V的值更新為B,否則不修改并告訴V的值實際為多少,”CAS是項樂觀鎖技術(shù),當(dāng)多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程并不會被掛起,而是被告知這次競爭中失敗,并可以再次嘗試。CAS有3個操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值V修改為B,否則什么都不做。

          CAS 操作包含三個操作數(shù) —— 內(nèi)存位置(V)、預(yù)期原值(A)和新值(B)。 如果內(nèi)存位置的值與預(yù)期原值相匹配,那么處理器會自動將該位置值更新為新值 。否則,處理器不做任何操作。無論哪種情況,它都會在 CAS 指令之前返回該 位置的值。(在 CAS 的一些特殊情況下將僅返回 CAS 是否成功,而不提取當(dāng)前 值。)CAS 有效地說明了“我認(rèn)為位置 V 應(yīng)該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現(xiàn)在的值即可。”

          通常將 CAS 用于同步的方式是從地址 V 讀取值 A,執(zhí)行多步計算來獲得新 值 B,然后使用 CAS 將 V 的值從 A 改為 B。如果 V 處的值尚未同時更改,則 CAS 操作成功。

          類似于 CAS 的指令允許算法執(zhí)行讀-修改-寫操作,而無需害怕其他線程同時 修改變量,因為如果其他線程修改變量,那么 CAS 會檢測它(并失敗),算法 可以對該操作重新計算。

          二、CAS的目的

          利用CPU的CAS指令,同時借助JNI來完成Java的非阻塞算法。其它原子操作都是利用類似的特性完成的。而整個J.U.C都是建立在CAS之上的,因此對于synchronized阻塞算法,J.U.C在性能上有了很大的提升。

          三、CAS存在的問題

          CAS雖然很高效的解決原子操作,但是CAS仍然存在三大問題。ABA問題,循環(huán)時間長開銷大和只能保證一個共享變量的原子操作

          1. ABA問題。因為CAS需要在操作值的時候檢查下值有沒有發(fā)生變化,如果沒有發(fā)生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那么使用CAS進(jìn)行檢查時會發(fā)現(xiàn)它的值沒有發(fā)生變化,但是實際上卻變化了。ABA問題的解決思路就是使用版本號。在變量前面追加上版本號,每次變量更新的時候把版本號加一,那么A-B-A 就會變成1A-2B-3A。

          從Java1.5開始JDK的atomic包里提供了一個類AtomicStampedReference來解決ABA問題。這個類的compareAndSet方法作用是首先檢查當(dāng)前引用是否等于預(yù)期引用,并且當(dāng)前標(biāo)志是否等于預(yù)期標(biāo)志,如果全部相等,則以原子方式將該引用和該標(biāo)志的值設(shè)置為給定的更新值。

          關(guān)于ABA問題參考文檔: http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html

          2. 循環(huán)時間長開銷大。自旋CAS如果長時間不成功,會給CPU帶來非常大的執(zhí)行開銷。如果JVM能支持處理器提供的pause指令那么效率會有一定的提升,pause指令有兩個作用,第一它可以延遲流水線執(zhí)行指令(de-pipeline),使CPU不會消耗過多的執(zhí)行資源,延遲的時間取決于具體實現(xiàn)的版本,在一些處理器上延遲時間是零。第二它可以避免在退出循環(huán)的時候因內(nèi)存順序沖突(memory order violation)而引起CPU流水線被清空(CPU pipeline flush),從而提高CPU的執(zhí)行效率。

          3. 只能保證一個共享變量的原子操作。當(dāng)對一個共享變量執(zhí)行操作時,我們可以使用循環(huán)CAS的方式來保證原子操作,但是對多個共享變量操作時,循環(huán)CAS就無法保證操作的原子性,這個時候就可以用鎖,或者有一個取巧的辦法,就是把多個共享變量合并成一個共享變量來操作。比如有兩個共享變量i=2,j=a,合并一下ij=2a,然后用CAS來操作ij。從Java1.5開始JDK提供了AtomicReference類來保證引用對象之間的原子性,你可以把多個變量放在一個對象里來進(jìn)行CAS操作。

          四、concurrent包的實現(xiàn)

          由于java的CAS同時具有 volatile 讀和volatile寫的內(nèi)存語義,因此Java線程之間的通信現(xiàn)在有了下面四種方式:

          1. A線程寫volatile變量,隨后B線程讀這個volatile變量。
          2. A線程寫volatile變量,隨后B線程用CAS更新這個volatile變量。
          3. A線程用CAS更新一個volatile變量,隨后B線程用CAS更新這個volatile變量。
          4. A線程用CAS更新一個volatile變量,隨后B線程讀這個volatile變量。

          Java的CAS會使用現(xiàn)代處理器上提供的高效機(jī)器級別原子指令,這些原子指令以原子方式對內(nèi)存執(zhí)行讀-改-寫操作,這是在多處理器中實現(xiàn)同步的關(guān)鍵(從本質(zhì)上來說,能夠支持原子性讀-改-寫指令的計算機(jī)器,是順序計算圖靈機(jī)的異步等價機(jī)器,因此任何現(xiàn)代的多處理器都會去支持某種能對內(nèi)存執(zhí)行原子性讀-改-寫操作的原子指令)。同時,volatile變量的讀/寫和CAS可以實現(xiàn)線程之間的通信。把這些特性整合在一起,就形成了整個concurrent包得以實現(xiàn)的基石。如果我們仔細(xì)分析concurrent包的源代碼實現(xiàn),會發(fā)現(xiàn)一個通用化的實現(xiàn)模式:

          1. 首先,聲明共享變量為volatile;
          2. 然后,使用CAS的原子條件更新來實現(xiàn)線程之間的同步;
          3. 同時,配合以volatile的讀/寫和CAS所具有的volatile讀和寫的內(nèi)存語義來實現(xiàn)線程之間的通信。

          AQS,非阻塞數(shù)據(jù)結(jié)構(gòu)和原子變量類(java.util.concurrent.atomic包中的類),這些concurrent包中的基礎(chǔ)類都是使用這種模式來實現(xiàn)的,而concurrent包中的高層類又是依賴于這些基礎(chǔ)類來實現(xiàn)的。從整體來看,concurrent包的實現(xiàn)示意圖如下:

          點登錄 (SingleSign-On,SSO) ,是一種幫助用戶快捷訪問網(wǎng)絡(luò)中多個站點的安全通信技術(shù)。單點登錄系統(tǒng)基于一種安全的通信協(xié)議,該協(xié)議通過多個系統(tǒng)之間的用戶身份信息的交換來實現(xiàn)單點登錄。使用單點登錄系統(tǒng)時,用戶只需要登錄一次,就可以訪問多個系統(tǒng),不需要記憶多個口令密碼。

          云程平臺支持CAS、OAuth2、JWT三種主流的單點登錄技術(shù),客戶可根據(jù)需求選擇對應(yīng)技術(shù)方案。

          一、CAS總體架構(gòu)介紹

          CAS(Central Authentication Service)是 Yale大學(xué)發(fā)起的一個企業(yè)級的、開源的項目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點登錄解決方法。CAS的目標(biāo)是允許用戶訪問多個應(yīng)用程序只提供一次用戶憑據(jù)(如用戶名和密碼)。

          CAS 體系包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負(fù)責(zé)對用戶的認(rèn)證工作;CAS Client 負(fù)責(zé)處理對客戶端受保護(hù)資源的訪問請求,需要登錄時,重定向到 CAS Server。

          CAS 具有以下特點:

          • 一個開放的,文檔齊全的協(xié)議。
          • 開源的JAVA服務(wù)器組件。
          • CAS Client 支持非常多的客戶端(這里指單點登錄系統(tǒng)中的各個 Web 應(yīng)用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
          • 文檔社區(qū)化和實現(xiàn)的支持。
          • 具有廣泛的客戶群的支持。

          CAS官方文檔:https://apereo.github.io/cas/5.3.x/index.html#

          二、CAS單點原理和集成流程

          在 CAS 的整個登錄過程中,有三個重要的概念。

          1. TGT:TGT 全稱叫做 Ticket Granting Ticket,這個相當(dāng)于我們平時所見到的 HttpSession 的作用,用戶登錄成功后,用戶的基本信息,如用戶名、登錄有效期等信息,都將存儲在此。
          2. TGC:TGC 全稱叫做 Ticket Granting Cookie,TGC 以 Cookie 的形式保存在瀏覽器中,根據(jù) TGC 可以幫助用戶找到對應(yīng)的 TGT,所以這個 TGC 有點類似與會話 ID。
          3. ST:ST 全稱是 Service Ticket,這是 CAS Sever 通過 TGT 給用戶發(fā)放的一張票據(jù),用戶在訪問其他服務(wù)時,發(fā)現(xiàn)沒有 Cookie 或者 ST ,那么就會 302 到 CAS Server 獲取 ST,然后會攜帶著 ST 302 回來,CAS Client 則通過 ST 去 CAS Server 上獲取用戶的登錄狀態(tài)。

          CAS的單點登錄SSO流程如下, 應(yīng)用系統(tǒng)要做單點登錄,需要跟CAS服務(wù)進(jìn)行集成,首先要理解CAS集成流程和原理。

          1. 用戶通過瀏覽器訪問應(yīng)用1,應(yīng)用1 發(fā)現(xiàn)用戶沒有登錄,于是返回 302,并且攜帶上一個 service 參數(shù),讓用戶去 CAS Server 上登錄。
          2. 瀏覽器自動重定向到 CAS Server 上,CAS Server 獲取用戶 Cookie 中攜帶的 TGC,去校驗用戶是否已經(jīng)登錄,如果已經(jīng)登錄,則完成身份校驗(此時 CAS Server 可以根據(jù)用戶的 TGC 找到 TGT,進(jìn)而獲取用戶的信息);如果未登錄,則重定向到 CAS Server 的登錄頁面,用戶輸入用戶名/密碼,CAS Server 會生成 TGT,并且根據(jù) TGT 簽發(fā)一個 ST,再將 TGC 放在用戶的 Cookie 中,完成身份校驗。
          3. CAS Server 完成身份校驗之后,會將 ST 拼接在 service 中,返回 302,瀏覽器將首先將 TGC 存在 Cookie 中,然后根據(jù) 302 的指示,攜帶上 ST 重定向到應(yīng)用1。
          4. 應(yīng)用1 收到瀏覽器傳來的 ST 之后,拿去 CAS Server 上校驗,去判斷用戶的登錄狀態(tài),如果用戶登錄合法,CAS Server 就會返回用戶信息給 應(yīng)用1。
          5. 瀏覽器再去訪問應(yīng)用2,應(yīng)用2 發(fā)現(xiàn)用戶未登錄,重定向到 CAS Server。
          6. CAS Server 發(fā)現(xiàn)此時用戶實際上已經(jīng)登錄了,于是又重定向回應(yīng)用2,同時攜帶上 ST。
          7. 應(yīng)用2 拿著 ST 去 CAS Server 上校驗,獲取用戶的登錄信息。
          8. 在整個登錄過程中,瀏覽器分別和 CAS Server、應(yīng)用1、應(yīng)用2 建立了會話,其中,和 CAS Server 建立的會話稱之為全局會話,和應(yīng)用1、應(yīng)用2 建立的會話稱之為局部會話;一旦局部會話成功建立,以后用戶再去訪問應(yīng)用1、應(yīng)用2 就不會經(jīng)過 CAS Server 了。

          三、CAS服務(wù)端如何部署

          云程平臺對CAS 5.3.x版本無縫集成,并對CAS認(rèn)證校驗進(jìn)行了擴(kuò)展,項目上請使用平臺提供的CAS 5.3.x運行包。運行CAS之前需要在數(shù)據(jù)庫先執(zhí)行平臺的腳本,CAS獲取用戶信息需訪問平臺的SYS_USER表。

          1 修改數(shù)據(jù)庫連接

          打開 cas\WEB-INF\classes\application.properties

          修改如下配置:

          #數(shù)據(jù)庫配置

          spring.datasource.driver-class-name=com.mysql.jdbc.Driver
          spring.datasource.url=jdbc:mysql://127.0.0.1:3306/yuncheng2021?characterEncoding=UTF-8&useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
          spring.datasource.username=root
          spring.datasource.password=root
          spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
          spring.jpa.database=mysql
          spring.jpa.show-sql=true
          spring.jpa.hibernate.ddl-auto=update
          spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

          2 啟動cas

          需要準(zhǔn)備tomcat,把cas包放到tomcat/webapps目錄下,在tomcat/bin目錄下執(zhí)行startup.bat(windows)或startup.sh(linux)。

          啟動成功后訪問cas地址,界面如下圖所示:

          四、云程如何對接CAS

          平臺后端CAS配置

          云程平臺后端已集成CAS代碼,在yml配置文件中配置cas服務(wù)地址即可。

          application.yml 進(jìn)行如下配置:

          #cas單點登錄
          cas:
          prefixUrl: http://cas.example.org:8443/cas

          平臺前端CAS配置

          修改public/config/bootConfig.js

          VUE_APP_SSO設(shè)置為true

          VUE_APP_CAS_BASE_URL配置單點登錄服務(wù)地址


          主站蜘蛛池模板: 亚欧成人中文字幕一区| 国产免费一区二区视频| 无码人妻一区二区三区精品视频| 亚洲线精品一区二区三区| 国模精品视频一区二区三区| 国产AV午夜精品一区二区入口 | 无码播放一区二区三区| 国产午夜精品一区二区三区嫩草| 美女视频一区二区| 国产精品视频无圣光一区| 国产手机精品一区二区 | 中文字幕精品亚洲无线码一区应用| 国产精品一区二区无线| 国产在线一区二区三区在线| 在线观看精品一区| 国产精品一区二区资源| 无码日韩AV一区二区三区| 日韩一区二区三区不卡视频| 天堂一区二区三区在线观看| 久久精品无码一区二区无码| 国产精品丝袜一区二区三区| 高清国产AV一区二区三区| 亚洲福利视频一区| 日日摸夜夜添一区| 精品不卡一区二区| 国产一区二区三区小说| 免费萌白酱国产一区二区| 精品91一区二区三区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲熟女综合色一区二区三区| 无码精品黑人一区二区三区| 搡老熟女老女人一区二区| 久久精品无码一区二区WWW| 亚洲AV无码国产精品永久一区| 亚洲欧美国产国产综合一区| 国产日韩视频一区| 国产一区二区三区精品视频| 任你躁国产自任一区二区三区| 亚洲国产精品无码久久一区二区| 91香蕉福利一区二区三区| 精品国产一区二区三区免费看|