Apache 和每个用户的 WebDAV DocumentRoot

Apache 和每个用户的 WebDAV DocumentRoot

我设置了一个 WebDAV 用户,目前从我的 MySQL 数据库获取用户名和密码。我让用户选择使用 WebDAV 进行大文件上传(这是为了我目前正在开发的文件共享服务),但我遇到了一个小问题,我似乎无法弄清楚。

首先 - 我该如何让每个用户都有自己的 WebDAV 根目录,这样他们就无法查看其他用户的文件?我已经运行了一个 cronjob,它会检查启用了 WebDAV 的任何用户,并自动创建具有适当权限的目录。我只需要一些方法来告诉 apache 这一点。

谢谢您的帮助,我非常感激。

我也知道我可以每分钟运行一个 cronjob 来生成一个 apache 配置并重新加载该 apache 配置,但这会产生太多的开销,我希望有更多的灵活性。

答案1

遗憾的是,Apache 的配置不如 nginx 灵活,因此您可以执行以下操作:

Alias /dav /path/to/dav/store/$REMOTE_USER

然而,你REMOTE_USER在重写规则中使用,如下所示:

RewriteEngine On
RewriteRule ^/dav(.*)$ /__davinternal/%{LA-U:REMOTE_USER} [PT]

然后将您所有的 auth/DAVish 可爱之处融入其中,<Location /__davinternal>成为您阿姨的同居情人。

如果您的文件系统中为所有用户提供了一致的位置(例如),则此方法非常有效/path/to/dav/store/<username>;如果您的用户文件夹分散在文件系统中(使用 MySQL 中的映射),您仍然可以映射用户位置,但您必须使用RewriteMap

RewriteMap davdirs txt:/path/to/user/dir/map.txt
RewriteRule /^dav(.*)$ /__davinternal/${davdirs:%{LA-U:REMOTE_USER}}

您可以直接从 MySQL 中执行 RewriteMap(通过外部脚本),但我会尝试让我的应用程序在映射信息发生更改时更新 dbm 文件,并使用 dbm 映射 - 性能更好,并且不会使您的数据库陷入困境。

我没有在这个答案中涉及这些设置的安全隐患,部分原因是我自己也不完全确定,也因为我不知道你的确切安全策略是什么。

答案2

据我所知(2-3年前),您需要添加每个用户/目录配置。

# cat /etc/apache2/conf.d/dav_store.conf
# First you need to say that a share under location X will be a webdav share:

Alias /store /home/davfs/storage/                                                                                                                                                 
<Directory /home/davfs/storage/>
        DAV On
        AuthType Basic
        AuthName "sample"

        Auth_MySQL On
        Auth_MySQL_Authoritative On
        Auth_MySQL_Host localhost
        Auth_MySQL_User _admin
        Auth_MySQL_Password 123
        Auth_MySQL_DB dav
        Auth_MySQL_Password_Table auth_user
        Auth_MySQL_Username_Field username
        Auth_MySQL_Password_Field password
        Auth_MySQL_Empty_Passwords Off
        Auth_MySQL_Encryption_Types Django #This was custom.
        #AuthMySQLUserCondition = "is_active = 1"

        # non root users cannot view this directory
        Options -Indexes -MultiViews
        AllowOverride None
        require user root;

</Directory>


<Directory /home/davfs/storage/*/>
        DAV On
        require user root;
</Directory>

Include /home/davfs/etc/conf.d/*.dvu

每个用户的配置文件将用户锁定到某个目录。以下是示例

<Directory /home/davfs/storage/lm/lmwangi/>                                                                                                                                     
        # We need this in subdirs.. otherwise error messages such as
        # "DAV Off" cannot be used to turn off a subtree of a DAV-enabled location.
        # will fill up your log
        DAV On

        require user lmwangi
</Directory>

这就是全部了。我认为每次更改配置时都必须重新加载 Apache。如果可以使用 Apache 模块完成这些任务,那就太好了……(不再需要 cron 来生成配置,不再需要重新加载等)

相关内容