我有一個網站http://blahblah.com 我想在任何內容之前添加一個登入頁面http://blahblah.com。我在php中編寫了一些簡單的登入程式碼。問題是我無法修改 blahblah 中的程式碼,它是用 Rust 和其他語言編寫的一些微服務。
在login.php中,我可以根據需要重定向到blahblah.com。我知道如果人們訪問 blahblah.com 我可以強制 haproxy 重定向到 my-login.com ,然後在 my-login.com 中我可以重定向到 blahblah.com 但這可能最終會陷入循環。
有人可以幫助/給我關於 haproxy 配置應該是什麼樣子才能完成這項工作的提示嗎?
答案1
HAProxy 可能不是最好的工具,但如果不更好地了解您的架構和用法,就很難說。無論如何,方法之一是使用map
函數來選擇正確的後端。
看https://www.haproxy.com/blog/introduction-to-haproxy-maps/,但大致上你會做類似的事情
frontend frontend-blahblah
bind *:443
use_backend %[req.hdr(x-app-auth),map(/mnt/resource/token.map,backend-unauth)]
映射文件/mnt/resource/token.map
將包含一個身份驗證密鑰列表,每個密鑰都映射到backend-auth
後端(即 blahblah.com)。沒有身份驗證金鑰的任何人都會被傳送到backend-unauth
(即您的登入伺服器)。
您還需要執行以下操作:
X-App-Auth
在此範例中,應用程式必須隨每個請求發送標頭。或將其更改為使用 cookie,例如req.cook(APPAUTH)
.- 當使用者登入或登出時,
/mnt/resource/token.map
登入伺服器需要更新地圖檔案。請參閱上面引用的文章,以了解執行此操作的幾種方法。也許最簡單的方法是使用http-request set-map
和http-request del-map
限制對登入伺服器 IP 的訪問,例如讓 HAProxy 偵聽單獨的「管理連接埠」並拒絕來自其他 IP 以及任何其他安全措施的請求。例如,您的登入伺服器可能會調用https://blahblah.com:8443/add-token/123456789..。新增身份驗證金鑰。 - 登入伺服器需要負責設定 cookie/將身份驗證金鑰傳回給客戶端。可能存在一些跨站點問題,這意味著可能需要進行一些 HAProxy 標頭調整;您可能已經考慮並解決了這些問題。
所有這些都是一個鈍器——用戶已登入並有權或無權訪問該網站。區分用戶的粒度並不多;如果您想要這樣,最好將登入伺服器作為代理放在其他網站前面。