在工作中我们遇到一个问题,当用户访问通过 Apache2 管理的 URL 时,我们希望根据用户是否是特定 LDAP 组的成员来重定向用户。
有三种情况:
- 用户提供有效的凭证并且是 LDAP 组的成员 => 重定向到应用程序 ABC(有效)
- 用户提供了有效的凭证,但不是 LDAP 组的成员 => 重定向到维护页面(不起作用,这是问题所在)
- 用户提供无效的凭证或点击取消 => 重定向至维护(有效)
我们的问题是:如果用户有效并且不是 LDAP 组“THE-GROUP”的成员,我们如何重定向用户?
现在,输入凭据的覆盖层会无限期地显示,除非您单击取消或成为“THE-GROUP”的成员。
我们的应用程序 ABC 托管在我们的场所,在 Ubuntu 上运行。我们的反向代理是运行在 Ubuntu 16.04 上的 Apache 2.4.18-2ubuntu3.10。客户将使用来自世界各地的各种浏览器和操作系统,因此按 IP 进行过滤不是一种选择。反向代理位于我们的 DMZ 中,而应用服务器位于外部。创建了 NAT 规则,以便两个系统都可以通过 8080(ABC 正在运行的端口)进行通信。
我们的(测试)配置如下所示:
<VirtualHost *:443>
ServerName testabc.company.com
SSLProxyEngine On
SSLEngine On
SSLCertificateKeyFile /etc/ssl/private/our_company.key
SSLCertificateFile /etc/ssl/certs/company_com/fullchain.cer
ErrorLog ${APACHE_LOG_DIR}/LDAP_test_error.log
CustomLog ${APACHE_LOG_DIR}/LDAP_test_access.log combined
# error document shown to unauthorized users
DocumentRoot /var/www/Maintenance_Page
ErrorDocument 401 /TTT/index.html
<Location />
ProxyPass http://internal-vm-name:8080/
ProxyPassReverse http://internal-vm-name:8080/
</Location>
# the following block applies to all proxied content
<Proxy "*">
AuthType Basic
AuthBasicProvider ldap
AuthUserFile /dev/null
AuthName "Auth with our LDAP Server"
# configuration of the mod_authnz_ldap module
AuthLDAPURL "ldap://SOMETHING"
AuthLDAPBindDN "FOO,BAR "
AuthLDAPBindPassword "FOOBAR"
# Only users belonging to group THE-GROUP can access ABC,
# all others will see the error document specified above.
Require ldap-group CN=THE-GROUP,OU=Company,DC=ad,DC=Company,DC=com
</Proxy>
</VirtualHost>
# virtual host required to access images and style-sheets from the error document
<VirtualHost *:80>
ServerName maintenance.company.com
DocumentRoot /var/www/Maintenance_Page
ErrorLog ${APACHE_LOG_DIR}/maintenance -error.log
CustomLog ${APACHE_LOG_DIR}/maintenance.log combined
</VirtualHost>
# redirection from HTTP to HTTPS
<VirtualHost *:80>
ServerName abc.company.com
Redirect Permanent / https://abc.company.com/
Redirect / https://abc.company.com/
</VirtualHost>
答案1
您的问题没有好的解决办法。您正在使用 HTTP Basic Auth,这意味着浏览器正在尝试打开一个页面,并发送了 WWW-Authenticate: Basic realm="Whatever" 标头,从而获取 401 状态。
此时浏览器会显示身份验证对话框,输入用户和密码后,它们就会通过授权标头发送到网络服务器。
如果服务器拒绝请求,它将再次发送带有 WWW-Authenticate 标头的 401 状态。浏览器将无限次再次弹出对话框。服务器绝不会说密码被永久拒绝。
如果您使用的是 mod_dbd 支持的数据库,则可以使用 mod_rewrite 对组执行 SQL 查询并进行相应的重定向。我不认为 LDAP Auth 处理程序可以做到这一点。