AuthUserFile dinâmico no Apache com mod_rewrite. É possível?

AuthUserFile dinâmico no Apache com mod_rewrite. É possível?

Eu tenho um servidor com várias contas scponly e quero fornecer acesso http em autenticação básica.

A primeira parte do problema é resolvida usando mod_rewrite para cortar e selecionar o diretório correto para cada usuário. Mas o problema surge quando tento estabelecer um arquivo de usuário de autenticação diferente para cada usuário. Simplesmente não consigo descobrir como fazer isso.

Aqui está um exemplo de configuração.

<VirtualHost an-ip-number-and:a-port>
    ServerName *.example.com
    RewriteEngine On
    UseCanonicalName Off

    RewriteCond %{HTTP_HOST} ^(.*).example.com
    RewriteCond /server/scponly/%1/incoming -d
    RewriteRule ^(.+)   %{SERVER_NAME}$1 [C]
    RewriteRule ^([^.]+)\.example\.com/(.*) /server/scponly/$1/incoming/$2 [L]

    RewriteRule ^(.+) http://FAIL.example.com

    <Directory /server/scponly/*/incoming>
        AuthType Basic
        AuthName "SFTP-HTTP Area"
        AuthUserFile  ???????   # <-- this!
        require valid-user
    </Directory>
</VirtualHost> 

Notas:

  • Não consigo descartar o mod_rewrite porque a configuração real está misturada com outro nome de servidor/verificação de diretório/reescrita para outros fins.
  • Não consigo mover detalhes de autenticação para arquivos .htaccess porque os usuários podem apagá-los. Mas estou interessado em saber se esta abordagem seria uma solução parcial.
  • Também estou interessado em outras abordagens
  • Preciso diferenciar arquivos de autenticação para cada diretório, ter apenas um arquivo concederá acesso a todos os diretórios para cada usuário

Responder1

Para expandir a resposta do peelman, você precisará ter uma seção separada para cada usuário:

<Directory /server/scponly/*/incoming>
    AuthType Basic
    AuthName "SFTP-HTTP Area"
    AuthUserFile  /path/to/user/htpasswd
</Directory>
<Directory /server/scponly/bob/incoming>
    require user bob
</Directory>
<Directory /server/scponly/smith/incoming>
    require user smith
</Directory>

Uma abordagem radical seria usar mod_perl que permite configurar o apache com perl. Isso iria em um arquivo de configuração do Apache:

<Perl>

for $dir (glob "/server/scponly/*/incoming") {

  ($user) = $dir =~ m%/server/scponly/([^/]+)/incoming%;

  exists $Directory{$dir} or $Location{$dir} = { };
  $Directory{$dir}{AuthType} = 'Basic';
  $Directory{$dir}{AuthName} = 'SFTP-HTTP Area';
  $Directory{$dir}{AuthUserFile} = '/path/to/htpasswd';
  $Directory{$dir}{require} = "user $user";

}

</Perl>

(Escrito em cima da minha cabeça.)

Responder2

Huh? Você pode ter apenas um arquivo. Você só precisa alterar seu parâmetro Require para ser o ID do usuário em vez de usuário válido. Veja aqui: Documentos Apache.

informação relacionada