访问控制 - Apache 2 仅允许用户'x'打开 URL 'example.com/private/x'



我有一个关于Apache 2中的访问控制的问题。我认为这无关紧要,但我正在使用Raspbian在Raspberry Pi 2上运行它。

有多个用户可以使用该网站。但是,有一个文件夹,每个用户在其中都有自己的文件夹。每个用户只能访问自己的文件夹,而不能访问其他文件夹。

我遇到的问题是,似乎唯一的方法是将每个文件夹添加到配置文件中,这使得添加用户相当耗时。那么还有别的办法吗?


澄清一下:
假设有三个用户:用户xyz
它们都可以访问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 文档中找到可以帮助我的东西,但我找不到任何可以让我更接近答案的东西。


总结一下:是否可以在不将所有位置添加到配置文件的情况下执行此操作,如果是这样,怎么可能?
提前感谢您的投入,德西里乌斯


PS:我

差点忘了,我不确定它是否相关,但是身份验证是使用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>

对于所有花时间阅读我问题的人,我感谢你们!

我希望这个答案有一天能帮助别人。

最新更新