Re: динамический dav methods $DAV;
Maxim Dounin
mdounin at mdounin.ru
Tue Apr 14 21:42:38 UTC 2015
Hello!
On Tue, Apr 14, 2015 at 03:38:11PM -0400, itcod wrote:
> "Реальнее - использовать средства контроля доступа, см. выше."
>
> Максим спасибо.
> Из всех перечисленных вами средств похоже только limit_except по описанию
> может раздельно влиять
> на методы применяемые в WEBDAV (DELETE, MKCOL, COPY, MOVE, OPTIONS,
> PROPFIND)
Вам кажется. Контроль доступа в зависимости от метода можно
делать, помимо limit_except, ещё как минимум с помощью директив
модуля rewrite:
if ($request_method = POST) {
return 403;
}
Не говоря уже о выгрузке логики доступа в скриптовые языки (perl,
тот же lua) или вообще на бекенды с помощью auth_request.
> Задача тривиальна при изменении переменной (она изменяется из программы lua)
> разрешить или блокировать метод GET. Создал для проверки конструкцию
>
> set $limit_get all;
> limit_except GET {
> deny $limit_get all;
> }
> Получил ошибку:
> nginx: [emerg] invalid parameter "limit_get" ....
>
> Вывод1. Средство контроля не знает переменных и не может в зависимости от
> внешних условий (прав пользователя) заблокировать/разблокировать метод.
Ваша проблема в том, что вы упорно пытаетесь использовать
переменные там, где они не поддерживаются. Повторю: переменные
поддерживают только некоторые директивы nginx'а. BTW, если в
какой-либо директиве можно использовать переменные - это явно
указано в документации.
> Вывод2. Перечисленные вами средства контроля не решают задачи динамической
> установки доступных пользователю(имя:пароль) методов (прав доступа).
См. выше, вам кажется.
> Я пока не вижу способа запретить ему создавать каталоги или стирать файлы
> если он зашёл в папку.... и это приводит нас к однопользовательской системе
> алядос... может я чего то не вижу ? может где то есть эта возможность
> динамически управлять методами(правами). Всё таки хочется сделать
> простенькую полноценную систему управления доступом к файлам в webdav...
Если данные о том, можно что-то пользователю или нет - из
скриптового языка, то проще всего вашу задачу решить с помощью
скриптового языка же, вернув ошибку непосредственно из него.
Тривиальный авторизатор на auth_basic, требующий от всех
пользователей ввода логина/пароля, и разрешающий некоторым из них
методы, отличные от GET, делается как-то так:
server {
listen 80;
server_name dav.example.com;
location / {
auth_basic "restricted site";
auth_basic_user_file /path/to/users;
dav_methods PUT DELETE;
limit_except GET {
auth_basic "restricted site";
auth_basic_user_file /path/to/admins;
}
...
}
}
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru