Мне понадобится помощь в настройке 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 перезагружает HAproxy каждые 5 минут. Это отбрасывает активные сеансы, и пользователь будет возвращаться к базовой аутентификации, пока не перезагрузит страницу из основного приложения PHP.
Поэтому моя идея заключалась в том, чтобы отслеживать любую активность пользователя за сеанс вместе с меткой времени, чтобы я мог записывать любые сеансы младше 15 минут в /var/lib/haproxy/app_user_sessions.acl из моего сценария перезагрузки cron HAproxy. После этого HAproxy сможет читать существующие сеансы оттуда после каждой перезагрузки, чтобы существующие сеансы не прерывались.
К сожалению, я не могу запустить определения карт, поскольку я не получаю результата, получая их содержимое через сокет администратора HAproxy (используя HAtop для ручной проверки).
Будет ли какой-нибудь настоящий компьютерщик HAproxy, который поможет мне как-нибудь закончить эту последнюю часть? Я был бы очень благодарен за это.
С уважением, Джулиан