![Apache2 mod_userdir和mod_authnz_external,如何限制对自己主页的访问](https://linux22.com/image/769164/Apache2%20mod_userdir%E5%92%8Cmod_authnz_external%EF%BC%8C%E5%A6%82%E4%BD%95%E9%99%90%E5%88%B6%E5%AF%B9%E8%87%AA%E5%B7%B1%E4%B8%BB%E9%A1%B5%E7%9A%84%E8%AE%BF%E9%97%AE.png)
Apache2 设置和mod_userdir
,mod_authnz_external and pwauth
以便每个用户都可以访问自己的主页并可以通过其本地 UNIX 凭据进行身份验证。
现在我需要某种授权,以便每个用户经过身份验证后只能访问自己的主目录,而不能访问其他用户的主目录。
注意事项:在我的设置中,用户不一定是其主目录的所有者,因此mod_authz_owner
在这里不起作用。
另一个问题:%{REMOTE_USER}
Apache 设置的变量不能在<If >
指令(或其他可能有帮助的指令)中使用,因为身份验证是在请求处理过程中完成的。
我如何使用 Apache2 实现我的目标?例如,是否有可能从中提取用户主目录名称%{REQUEST_URI}
并将其传递给
Require user ...
指令?我还没能找到如何做到这一点,所以任何帮助我都会很感激。
答案1
您需要编写自己的身份验证器脚本。您应该能够非常轻松地完成此操作,而无需编写太多代码。
Apache 通过环境变量将请求的 URI 传递给身份验证器脚本,因此您需要调用验证码从您的脚本中验证用户名/密码组合,然后将给定的用户名与 URI 进行比较,以确保您刚刚验证其密码的用户名在所请求的 URI 中。
这是文档,当我为自己编写身份验证器时它非常有用。 https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS
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