我需要一些有关 HAproxy 配置的帮助,以绕过 HTTP 基本身份验证,并允许用户使用特定的后端,以防另一个后端应用程序存在有效的会话 cookie。
我通常在前端定义中使用以下配置来使其工作:
# Monitor application response headers for keywords and update user ACL
acl has_disallowAPPUser res.hdr(X-APP-DisallowUser) -m found
acl has_allowAPPUser res.hdr(X-APP-AllowUser) -m found
http-response del-acl(/var/lib/haproxy/app_user_sessions.acl) %[res.hdr(X-APP-DisallowUser)] if has_disallowAPPUser
http-response add-acl(/var/lib/haproxy/app_user_sessions.acl) %[res.hdr(X-APP-AllowUser)] if has_allowAPPUser
# Monitor application response headers for keywords and update admin ACL
acl has_disallowAPPAdmin res.hdr(X-APP-DisallowAdmin) -m found
acl has_allowAPPAdmin res.hdr(X-APP-AllowAdmin) -m found
http-response del-acl(/var/lib/haproxy/app_admin_sessions.acl) %[res.hdr(X-APP-DisallowAdmin)] if has_disallowAPPAdmin
http-response add-acl(/var/lib/haproxy/app_admin_sessions.acl) %[res.hdr(X-APP-AllowAdmin)] if has_allowAPPAdmin
# Check session cookie
acl is_appuser_session req.cook(PHPSESSID) -f /var/lib/haproxy/app_user_sessions.acl
acl is_appadmin_session req.cook(PHPSESSID) -f /var/lib/haproxy/app_admin_sessions.acl
# Monitor last session activity
http-request del-map(/var/lib/haproxy/app_user_sessions.map) %[req.cook(PHPSESSID)] if is_appuser_session
http-request set-map(/var/lib/haproxy/app_user_sessions.map) %[req.cook(PHPSESSID)] %[date()] if is_appuser_session
http-request del-map(/var/lib/haproxy/app_admin_sessions.map) %[req.cook(PHPSESSID)] if is_appadmin_session
http-request set-map(/var/lib/haproxy/app_admin_sessions.map) %[req.cook(PHPSESSID)] %[date()] if is_appadmin_session
# Do not show X-APP headers to the frontend user
rspidel ^X-APP-DisallowUser:.* if has_disallowAPPUser
rspidel ^X-APP-AllowUser:.* if has_allowAPPUser
rspidel ^X-APP-DisallowAdmin:.* if has_disallowAPPAdmin
rspidel ^X-APP-AllowAdmin:.* if has_allowAPPAdmin
# route to backend
use_backend bk_appuser-via-session if is_appadmin_uri is_appuser_session
use_backend bk_appadmin-via-session if is_appadmin_uri is_appadmin_session
use_backend bk_appuser-via-httpauth if is_appadmin_uri
use_backend bk_appadmin-via-httpauth if is_appadmin_uri
如果 PHP 应用程序成功创建用户会话并发送适当的 X-APP 标头,则允许直接访问后端应用程序。
这是我需要帮助的地方:
为了清理旧的 ACL,cron 每 5 分钟重新加载一次 HAproxy。这会删除活动会话,用户将返回到基本身份验证,直到他从主 PHP 应用程序重新加载页面。
因此,我的想法是跟踪每个会话的任何用户活动以及时间戳,以便我可以从我的 cron HAproxy 重新加载脚本中将任何少于 15 分钟的会话写入 /var/lib/haproxy/app_user_sessions.acl。然后,HAproxy 可以在每次重新加载后从那里读取现有会话,因此现有会话不会中断。
不幸的是,我无法运行地图定义,因为我无法通过 HAproxy 管理套接字获取其内容(使用 HAtop 进行手动检查)。
有没有真正的 HAproxy 极客能帮助我完成这最后一部分?我会非常感激。
问候,朱利安