Apache и пользовательский WebDAV DocumentRoot

У меня есть настроенный пользователь WebDAV, который в настоящее время получает имена пользователей и пароли из моей базы данных MySQL. Я даю пользователям возможность использовать WebDAV для загрузки больших файлов (это для службы обмена файлами, которую я сейчас разрабатываю), но у меня возникла небольшая проблема, которую я не могу понять.

Прежде всего - как бы мне было, чтобы у каждого пользователя был свой собственный корень WebDAV, чтобы он не мог просматривать файлы других пользователей? Я уже запускаю cronjob, который проверяет всех пользователей, которые включили WebDAV, и автоматически создает каталоги с соответствующими разрешениями. Мне просто нужен какой-то способ сказать Apache об этом.

Спасибо за любую помощь, я действительно ценю это.

Я также знаю, что мог бы просто запускать cronjob каждую минуту, чтобы генерировать мне конфигурацию apache и перезагружать конфигурацию apache, но это было бы слишком много накладных расходов, и я хотел бы получить больше гибкости.

2 ответа

Жаль, что конфигурация Apache не такая гибкая, как у nginx, поэтому вы можете сделать что-то вроде:

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

Тем не менее, вы можете использовать REMOTE_USER в правиле переписывания, вот так:

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

Затем положите всю свою прелесть <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}}

Вы можете сделать RewriteMap прямо из MySQL (с помощью внешнего скрипта), но я бы попытался заставить мое приложение обновлять файл dbm всякий раз, когда изменилась эта информация отображения, и вместо этого использовать карту dbm - намного лучшая производительность и не т забить вашу базу данных в землю.

В этом ответе я не рассказал о последствиях этих настроек для безопасности, отчасти потому, что сам в этом не уверен, а также потому, что не знаю, какой может быть ваша точная политика безопасности.

Насколько я могу судить (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... (больше нет крон для генерации конфигов, больше нет перезагрузок и т. Д.)

Другие вопросы по тегам