我有一个关于Apache 2中的访问控制的问题。我认为这无关紧要,但我正在使用Raspbian在Raspberry Pi 2上运行它。
有多个用户可以使用该网站。但是,有一个文件夹,每个用户在其中都有自己的文件夹。每个用户只能访问自己的文件夹,而不能访问其他文件夹。
我遇到的问题是,似乎唯一的方法是将每个文件夹添加到配置文件中,这使得添加用户相当耗时。那么还有别的办法吗?
澄清一下:
假设有三个用户:用户
x
,y
和z
。它们都可以访问
https://example.com/
,但除了用户x
之外,没有其他用户应该有权访问https://example.com/private/x/
,除了用户y
之外,没有人应该有权访问https://example.com/private/y/
,只有用户z
应该有权访问https://example.com/private/z/
。到目前为止,我所做和尝试过的事情:
我拒绝了对位置
/private
的所有访问,希望我可以让不同的用户访问他们各自的文件夹。我试图通过授予对位置
/private/%{REMOTE_USER}/
和/private/%{REMOTE_IDENT}/
的访问权限来做到这一点,这两者都不起作用。我还尝试使用
<If>
指令来检查 URL 是否与 /private/%{REMOTE_USER}/
匹配,但这也没有用。
我试图在 apache 文档中找到可以帮助我的东西,但我找不到任何可以让我更接近答案的东西。
总结一下:是否可以在不将所有位置添加到配置文件的情况下执行此操作,如果是这样,怎么可能?
提前感谢您的投入,德西里乌斯
差点忘了,我不确定它是否相关,但是身份验证是使用PAM完成的,大致如下:
<IfModule mod_authnz_external.c>
AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe
AddExternalGroupMethod unixgroup environment
</IfModule>
AuthType Basic
AuthBasicProvider external
AuthExternal pwauth
GroupExternal unixgroup
Require unix-group www-priv
所以我还在调查这个,发现了一些东西!
从 2.4.8 开始,命名组和反向引用将被捕获并使用以"MATCH_"为前缀且大写的相应名称写入环境。这允许从表达式和模块(如mod_rewrite)中引用 URL 的元素。为了防止混淆,将忽略编号(未命名)反向引用。请改用命名组。
<LocationMatch "^/combined/(?<sitename>[^/]+)">
require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>
(来自 apache 文档的 LocationMatch 指令的最后一部分。
现在我想通过以下方式利用它:
<LocationMatch "^/private/(?<user>[^/]+)">
Require expr "%{REMOTE_USER} == %{MATCH_USER}"
</LocationMatch>
但是Apache现在不会重新启动。当Require
行被注释掉时,它将重新启动,否则不会重新启动。以下方法也不起作用:
<LocationMatch "^/private/(?<user>[^/]+)">
<RequireAll>
Require valid-user
Require expr "%{REMOTE_USER} == %{MATCH_USER}"
<RequireAll>
</LocationMatch>
所以我仍然在寻求解决这个问题,但重点略有转移。如果有答案 如何使用Require
来检查经过身份验证的用户是否是变量中的用户?,那么这可能会解决整个问题。
与往常一样,提前感谢您的任何输入!
德西里乌斯
编辑 2:
我发现Require expr "true"
也不起作用。我怀疑Require expr
制造问题...
好的,我找到了答案。就在我编辑我的问题之后,我在 要求指令 中找到了评论:Since v2.4.8, expressions are supported within the user require directives.
.
所以我意识到我可以使用Require user "%{env:MATCH_USER}"
(连同我编辑的部分)。
为了提供更完整的图片,这是现在的配置
:<IfModule mod_authnz_external.c>
AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe
AddExternalGroupMethod unixgroup environment
</IfModule>
AuthType Basic
AuthBasicProvider external
AuthExternal pwauth
GroupExternal unixgroup
Require unix-group www-priv
<Location /private>
Require all denied
</Location>
<LocationMatch "^/radicale/(?<user>[^/]+)">
Require user "%{env:MATCH_USER}"
</LocationMatch>
对于所有花时间阅读我问题的人,我感谢你们!
我希望这个答案有一天能帮助别人。