no trabalho, estamos tendo o problema de querer redirecionar os usuários, dependendo se eles são membros de um determinado grupo LDAP, quando acessam uma URL gerenciada via Apache2.
Existem três casos:
- O usuário fornece credenciais válidas e é membro do grupo LDAP => redireciona para o aplicativo ABC (funciona)
- O usuário fornece creds válidos, mas não é membro do grupo LDAP => redireciona para a página de manutenção (não funciona e é o problema)
- O usuário fornece creds inválidos ou clica em cancelar => redirecionar para manutenção (funciona)
Nosso problema é: Como podemos redirecionar os usuários, se eles são válidos e não membros do grupo LDAP “THE-GROUP”?
No momento, a sobreposição para inserir credenciais é exibida ad finitum, a menos que você clique em cancelar ou em um membro de “THE-GROUP”.
Nosso aplicativo ABC está hospedado em nossas instalações, rodando no Ubuntu. Nosso proxy reverso é o Apache 2.4.18-2ubuntu3.10 rodando no Ubuntu 16.04. Os clientes usarão uma ampla variedade de navegadores e sistemas operacionais de todo o mundo, portanto, a filtragem por IP não é uma opção. O proxy reverso está localizado em nossa DMZ e o App-Server localizado fora. Foi criada uma NAT-Rule, para que ambos os sistemas possam se comunicar via 8080 (a porta ABC está rodando).
Nosso (Test)Config se parece com isso:
<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>
Não há uma boa solução para o seu problema. Você está usando HTTP Basic Auth, o que significa que o navegador está tentando abrir uma página, está obtendo um status 401 com um cabeçalho WWW-Authenticate: Basic realm="Whatever" enviado.
Nesse ponto, o navegador mostra a caixa de diálogo de autenticação e, uma vez inseridos o usuário e a senha, eles são enviados ao servidor da web dentro do cabeçalho de autorização.
Se o servidor rejeitar a solicitação, ele enviará um status 401 com o cabeçalho WWW-Authenticate novamente. O navegador abrirá a caixa de diálogo ad infinitum novamente. Em nenhum momento o servidor pode dizer que uma senha foi rejeitada definitivamente.
Se você estiver usando um banco de dados baseado em mod_dbd, poderá usar mod_rewrite para fazer uma consulta SQL para o grupo e redirecionar de acordo. Não acredito que isso seja possível com o manipulador de autenticação do LDAP.