Configuração do Apache2 com mod_userdir
e mod_authnz_external and pwauth
, para que cada usuário possa acessar sua página inicial e ser autenticado por suas credenciais UNIX locais.
Agora preciso de algum tipo de autorização para que cada usuário possa, após ser autenticado, acessar apenas seu próprio diretório pessoal, mas não os de outros usuários.
A ressalva: na minha configuração, um usuário não é necessariamente o proprietário de seu diretório inicial, portanto mod_authz_owner
não funcionará aqui.
Outro problema: %{REMOTE_USER}
a variável definida pelo Apache não pode ser usada dentro de <If >
diretivas (ou outras diretivas que possam ajudar aqui), porque a autenticação é feita tardiamente durante o processamento da solicitação.
Como posso atingir meu objetivo com o Apache2? Existe, por exemplo, a possibilidade de extrair o nome do diretório inicial do usuário %{REQUEST_URI}
e passá-lo para uma
Require user ...
diretiva? Não consegui descobrir como fazer isso, então qualquer ajuda seria apreciada.
Responder1
Você precisaria escrever seu próprio script autenticador. Você deve conseguir fazer isso facilmente, sem escrever muito código.
O Apache passa o URI solicitado ao script do autenticador por meio de uma variável de ambiente, então você precisa chamarpwauthdo seu script para validar a combinação de nome de usuário/senha e, em seguida, compare o nome de usuário fornecido com o URI para garantir que o nome de usuário cuja senha você acabou de validar esteja no URI que está sendo solicitado.
Aqui está a documentação, que foi muito útil quando escrevi um autenticador para mim. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS
Implementação funcional do autenticador em PHP:
#!/usr/bin/php
<?php
// Get the user name
$user = trim(fgets(STDIN));
// Get the password
$pass = trim(fgets(STDIN));
// Call pwauth to validate user and password combination
$handle = popen('/usr/sbin/pwauth', 'w');
fwrite($handle, $user."\n".$pass."\n");
if (pclose($handle) === 0) { // Password is valid for user
// Check if the URI belongs to the user
$uri = getenv('URI');
if (preg_match('#^/~'.$user.'/#', $uri)
|| preg_match('#^/~'.$user.'$#', $uri)) {
exit(0); // User matches requested URI
}
else exit(1); // User does not match requested URI
}
exit(1); // Password is not valid for user