CAS (3) —— Mac下配置CAS客戶端經代理訪問Tomcat CAS

Richaaaard發表於2015-12-14

CAS (3) —— Mac下配置CAS客戶端經代理訪問Tomcat CAS


tomcat版本: tomcat-8.0.29

jdk版本: jdk1.8.0_65

nginx版本: nginx-1.9.8

cas版本: cas4.1.2
cas-client-3.4.1

參考來源:

CAS實現單點登入(SSO)經典完整教程

CAS 4.0 配置開發手冊

cas客戶端應用實現

使用 CAS 在 Tomcat 中實現單點登入

Tomcat (1) —— Mac下配置Tomcat Https/SSL

【高可用HA】Apache (2) —— Mac下安裝多個Apache Tomcat例項

【高可用HA】Nginx (1) —— Mac下配置Nginx Http負載均衡(Load Balancer)之101例項

Mac為nginx安裝nginx-sticky-module

CAS (1) —— Mac下配置CAS到Tomcat(服務端)

CAS (2) —— Mac下配置CAS到Tomcat(客戶端)

目標架構

CAS (3) —— Mac下配置CAS客戶端經代理訪問Tomcat CAS

準備

要搭建上面這個環境會相對複雜,我們需要參照之前的文章準備以下必備的元件或環境:

  1. 2個Tomcat伺服器作為客戶端應用程式伺服器(即cas的客戶端)

     app1.hoau.com:8081/8413(http/https)
     app2.hoau.com:8082/8423(http/https)

    參照Tomcat ClusterTomcat SSLCAS Client

  2. 1個Nginx伺服器作為中間層代理轉發伺服器(後可擴充套件為LoadBalancer)

     proxy.sso.hoau.com:85/?(http/https)

    參照Nginx Load BalancerNginx Sticky Session

  3. 另一個1個帶有SSL的Tomcat伺服器作為CAS伺服器

     sso.hoau.com:8083/8433(http/https)

    參照Tomcat SSLCAS Server

配置

我們在之前的文章中已經實現了通過app1和app2客戶端直連CAS伺服器,從而實現SSO的目的:

CAS (1) —— Mac下配置CAS到Tomcat(服務端)

CAS (2) —— Mac下配置CAS到Tomcat(客戶端)

基於以上的配置web.xml,我們首先需要將兩個app的SSO伺服器指向nginx proxy(http://proxy.sso.hoau.com:85/cas/login),其中:

  • APP1: app1.hoau.com:8081/8413(http/https)

    • CAS Authentication Filter

        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <!--
            <param-value>https://sso.hoau.com:8433/cas/login</param-value>
            --> 
            <param-value>http://proxy.sso.hoau.com:85/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>https://app1.hoau.com:8413</param-value>
        </init-param>
    • CAS Validation Filter

        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <!--
                <param-value>https://sso.hoau.com:8433/cas</param-value>
            -->
            <param-value>http://proxy.sso.hoau.com:85/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>https://app1.hoau.com:8413</param-value>
        </init-param>
  • APP2: app2.hoau.com:8082/8423(http/https)

    同上

  • Nginx Proxy: proxy.sso.hoau.com:85/?(http/https)

    修改nginx.conf:

      upstream localhost {  
          #根據ip計算將請求分配各那個後端tomcat,許多人誤認為可以解決session問題,其實並不能。  
          #同一機器在多網情況下,路由切換,ip可能不同  
          #ip_hash;   
          sticky;
    
          #Richard: http
          #server localhost:8083;  
          #server localhost:8084;
    
          #Richard: https todo
          server sso.hoau.com:8433;  
          #server sso.hoau.com:8443;
      } 

    並開放https Proxy_ByPass

      location / {  
          proxy_connect_timeout   3;  
          proxy_send_timeout      30;  
          proxy_read_timeout      30;  
          #proxy_pass http://localhost;  
          proxy_pass https://localhost;  
      }  
* 注意: 在CAS目標伺服器為單節點時,sticky引數客戶忽略,預設為ip_hash。

測試

我們清空瀏覽器的cache和cookie,按照下列步驟操作

  1. 訪問"https://app1.hoau.com:8413/cas1"

    系統會將我們重定向到

     "http://proxy.sso.hoau.com:85/cas/login"。
  2. 輸入使用者名稱密碼"test01/psw01"

    登陸成功

  3. 訪問"https://app2.hoau.com:8423/cas2"

    系統會將我們重定向到

     "http://proxy.sso.hoau.com:85/cas/login"。

    但是系統不會用"test01/psw01"自動登陸。

* 按照以上步驟,交換app1與app2的操作順序,發現結果一樣,app1與app2均可以自行通過nginx proxy到CAS Server上登陸,但是看似無法共享Ticket

*擴充套件

問題來了

  • 為什麼不通過代理直連的時候,SSO正常,但是通過代理就不正常了呢?

懷疑點

  • Nginx proxy 沒有SSL?
  • CAS伺服器上的Ticket失效了?
  • Client App(Tomcat)--> Proxy(Nginx) --> CAS Server(Tomcat)這條線上什麼東西丟了?

請參考另一篇文章

CAS (5) —— Nginx代理模式下瀏覽器訪問CAS伺服器配置詳解

結束

相關文章