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
參考來源:
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(客戶端)
目標架構
準備
要搭建上面這個環境會相對複雜,我們需要參照之前的文章準備以下必備的元件或環境:
2個Tomcat伺服器作為客戶端應用程式伺服器(即cas的客戶端)
app1.hoau.com:8081/8413(http/https) app2.hoau.com:8082/8423(http/https)
1個Nginx伺服器作為中間層代理轉發伺服器(後可擴充套件為LoadBalancer)
proxy.sso.hoau.com:85/?(http/https)
另一個1個帶有SSL的Tomcat伺服器作為CAS伺服器
sso.hoau.com:8083/8433(http/https)
配置
我們在之前的文章中已經實現了通過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,按照下列步驟操作
訪問"https://app1.hoau.com:8413/cas1"
系統會將我們重定向到
"http://proxy.sso.hoau.com:85/cas/login"。
輸入使用者名稱密碼"test01/psw01"
登陸成功
訪問"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伺服器配置詳解