Usando Mod_rewrite e autenticação em todos os URLs recebidos

7

Preciso ter certeza de que meu URL, chamado www.domain.com, esteja sempre protegido pelo menos através da autenticação HTTP básica. Além disso, quero usar o mod_rewrite para enviar meus usuários para uma das duas instâncias do OC4j em execução no meu servidor. Também quero proteger meu painel de administração do OC4j (e outras funções do tipo administrador) com a mesma autenticação. Vou ter 2 usuários, chamá-los de administrador (o administrador terá acesso às instâncias do OC4j e ao painel de administração do OC4j) e convidado (o convidado poderá acessar apenas as instâncias do OC4j).

Então, digamos que eu tenho duas instâncias do OC4j - instance_a e instance_b. instance_a será executado na porta 8888 e instance_b será executado na porta 8889. Quando um usuário digita www.domain.com/instance_a, quero primeiro verificar se eles estão autenticados no servidor, e quero usar mod_rewrite para proxy da solicitação para www .domain.com: 8888 / instance_a. Isso seguirá o exemplo de instance_b. Novamente, QUALQUER usuário, administrador ou convidado, pode acessar essas instâncias. Se o usuário tentar acessar o painel de administração do OC4j diretamente em qualquer uma das instâncias, desejo expulsá-lo se ele não for um usuário administrador.

Eu tenho uma entrada VirtualHost que se parece com isso:

<VirtualHost *:80>
        ServerName www.domain.com
        CustomLog "/var/log/httpd/ic/access_log" "combined"
        ErrorLog "/var/log/httpd/ic/error_log"
        RewriteEngine on
        RewriteLogLevel 9
        RewriteLog "/var/log/httpd/rewrite_log"
        RewriteCond %{REMOTE_USER} !^guest$ [OR]
        RewriteCond %{REMOTE_USER} !^admin$
        RewriteCond %{REQUEST_URI} ^/instance_a.*$
        RewriteRule ^.*$ - [F,L]
        <LocationMatch "^/.*$">
                AuthType Basic
                AuthName "Please Login"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
        </LocationMatch>
</VirtualHost>

Por alguma razão, isso não está funcionando (não que eu esteja surpreso). Parece que quando eu uso os itens de autenticação e mod_rewrite, eles não funcionam juntos.

Desde já, obrigado.

El Guapo
fonte
O que você quer dizer quando diz que não está funcionando - o que está vendo?
blueberryfields

Respostas:

1

Acredito que o problema com a configuração postada são as duas primeiras linhas RewriteCond:

    RewriteCond %{REMOTE_USER} !^guest$ [OR]
    RewriteCond %{REMOTE_USER} !^admin$

Se REMOTE_USER for 'admin', o primeiro teste será bem-sucedido, causando uma resposta Proibida. O caso de 'convidado' é semelhante. Você pode tentar combinar os dois testes:

    RewriteCond %{REMOTE_USER} !^(guest|admin)$

Se REMOTE_USER for convidado ou administrador, ^(guest|admin)$corresponderá, fazendo com que todo o RewriteCond falhe.

fora
fonte
Ou, basta remover o ORsinalizador na primeira RewriteConddiretiva, para torná-lo um AND implícito . (Efetivamente o mesmo que sua regra combinada ... !^(guest|admin)$)
MrWhite
Eu estava me referindo à modificação das duas condições originais dos OPs (sua regra combinada está correta) ... !guest AND !admin(simplesmente removendo a [OR]) seria o equivalente à sua regra combinada !(guest OR admin). Apenas outra maneira de expressar a mesma coisa.
precisa
Mas o regex é negado ( !).
MrWhite
0

Não tenho certeza se isso vai ajudar ou não, mas convém retirar as Regras / Condições de reescrita do LocationMatch e colocá-lo antes / depois do LocationMatch.

Jordan S. Jones
fonte
Eu tentei isso, mas sem sucesso. Obrigado.
0

Caramba.

Isso não foi testado, mas talvez algo como:

<VirtualHost *:80>
        ServerName www.domain.com
        CustomLog "/var/log/httpd/ic/access_log" "combined"
        ErrorLog "/var/log/httpd/ic/error_log"
        RewriteEngine on
        RewriteRule ^(/instance_a/.*) http://localhost:8888/$1 [P]
        RewriteRule ^(/instance_b/.*) http://localhost:8889/$1 [P]
        <Proxy "http://localhost:888?/">
                AuthType Basic
                AuthName "Please Login"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
        </Proxy>
        <Proxy "http://localhost:888?/instance_?/admin">
                Require group admin
        </Proxy>
</VirtualHost>

Não tenho certeza se você precisa duplicar as diretivas de autenticação em cada Proxybloco - você precisará experimentar.

markdrayton
fonte