apache2 只允许用户 'x' 打开 url 'example.com/private/x'

apache2 allow only user 'x' to open url 'example.com/private/x'

我对 Apache 2 中的访问控制有疑问。我认为它不相关,但我 运行 它在 Raspberry Pi 2 和 Raspbian 上。

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

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


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


总结一下:是否可以在不将所有位置添加到配置文件的情况下执行此操作,如果可以,怎么可能?
提前感谢您的意见,Desirius


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


所以我仍在研究这个并发现了一些东西!

From 2.4.8 onwards, named groups and backreferences are captured and written to the environment with the corresponding name prefixed with "MATCH_" and in upper case. This allows elements of URLs to be referenced from within expressions and modules like mod_rewrite. In order to prevent confusion, numbered (unnamed) backreferences are ignored. Use named groups instead.

<LocationMatch "^/combined/(?<sitename>[^/]+)">
    require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>

LocationMatch directive 的最后一部分来自 apache 文档。)

现在我想通过以下方式使用它:

<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 检查经过身份验证的用户是否是来自变量的用户? 的答案,那么这可能会解决整个问题。

一如既往,提前感谢您的任何输入!
Desirius

编辑 2:
我发现 Require expr "true" 也不起作用。我怀疑 Require expr 造成了问题...

好的,我找到了答案。就在我编辑了我的问题之后,我在 Require Directives 找到了评论: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>

感谢所有花时间阅读我的问题的人!

我希望有一天这个答案能对其他人有所帮助。