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

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


tomcat版本: tomcat-8.0.29html

jdk版本: jdk1.8.0_65nginx

nginx版本: nginx-1.9.8web

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

參考來源:瀏覽器

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

CAS 4.0 配置開發手冊服務器

cas客戶端應用實現cookie

使用 CAS 在 Tomcat 中實現單點登陸session

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(客戶端)

目標架構

準備

要搭建上面這個環境會相對複雜,咱們須要參照以前的文章準備如下必備的組件或環境:

  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服務器配置詳解

結束

相關文章
相關標籤/搜索