我设置了一个 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 来生成配置,不再需要重新加载等)