Права доступа к Actions
Зачем это надо
Возможность задания прав доступа к страницам в Ваке является большим ее достоинством (и достаточно редким среди Wiki клонов). Но отсутствие такого же управления доступом к экшенам приводит к появлению дыр в безопасности и прочим неудобствам.
Если попытаться создать закрытый сайт и разрешить просмотр и комментирование отдельных страниц некоторым группам пользователей, то такой пользователь может ввести любой экшен в комментарии, и он выполнится. Например анонимный пользователь может включить в коммент экшен регистрации, стать зарегистрированным пользователем и получить доступ к закрытым для него ранее страницам. Кроме стандартных экшенов Ваки несложно разработать и специализированные экшены под свои нужды, и эти экшены тоже будут беззащитны.
Эту ситуацию легко исправить.
Как это сделать
- Создается кластер страниц, скажем Actions.
- В нем создаются подстраницы по одной на каждый экшен с именем этого экшена.
- На самой странице экшена может быть приведено описание этого экшена и примеры его использования.
- В правах доступа к этой странице с описанием экшена задаем список пользователей, которым разрешено пользоваться этим экшеном.
- В основном, для большинства экшенов используется список «Права на чтение», одновременно это делает описания экшенов доступными только тем пользователям, которые имеют право ими пользоваться.
- Для некоторых экшенов могут использоваться и другие списки доступа, например в экшене Files используется также список «Права на запись».
- В начало каждого экшена (в скрипте) добавляется одна строка вида:
<?
if (! $this->HasAccess('read', 'Actions/Files')) return;
.......
- Эта строчка проверяет наличие прав чтения страницы с именем Actions/Files и если права отсуствуют, экшен не выполняется.
- Если кластер Actions или подстраница скажем Actions/Registration не существуют в Ваке, то считается, что доступ разрешен всем.
Примеры использования
- При создании сайта только для чтения (+ коментирование) или закрытого клуба (проекта) можно разрешить регистрацию новых членов только владельцам сайта (админам) или членам клуба.
- Можно ограничить доступ к некоторым информационным экшенам только для зарегистрированных пользователей.
- Для экшена Files (загрузка файлов на страницу Ваки) можно запретить/разрешить группе пользователей закачку файлов из Ваки или запретить/разрешить загрузку файлов в Ваку независимо от их прав на чтение/редактирование страниц Ваки.
Обсуждение
Дополнительные идеи
- RomanIvanov: Вынести имя кластера в wakka.config.php.
- YuriMakarov Можно и так, смысла большого правда невижу...
- RomanIvanov: Смысл в том, чтобы не создавать помех тем пользователям, которые хотят обязательно использовать кластер Actions под какие-то другие нужды.
- YuriMakarov Согласен. По умолчанию можно принять кластер Actions
- Проверять права не в каждом экшне, а один раз, в Wakka::Action.
- YuriMakarov Да, была такая мысль, при этом все экшены будут контролироваться на автомате.
Но предложенный выше вариант мне показался гибче.
- Некоторым экшенам такой контроль вреден, например Login.
- RomanIvanov: Кто-то может захотеть именно логин спрятать, ведь правда?
- YuriMakarov Правда, а как тогда в систему заходить? :)) Ведь любой пользователь сначала заходит незалогиненым, а когда залогинится, Логин ему уже не нужен. Полагаться на то, что что-то в куках сохраниться вряд ли стоит.
- Некоторым экшенам контроля по чтению может быть недостаточно, например Files.
- RomanIvanov: Ну, это не мешает права на чтение проверять централизованно =)
- YuriMakarov Согласен, не мешает :) Я даже поначалу хотел было в Wakka::Action залездь, глянуть на предмет централизовано.. Но потом поленился ..
- YuriMakarov Еще одна идея. Я ее пока не пробовал, но она так же просто реализуется и позволяет контролировать экшены уже на уровне отдельных страниц. Достаточно добавить в экшен еще один необязательный параметр HasAccess (название условно) и в начале экшена (или в Wakka::Action) добавить еще одну проверку доступа. Параметр задает имя страницы права доступа к которой проверяются дополнительно. Получим возможность управлять экшеном на конкретной странице.
- Делается так:
<?
if (! $this->HasAccess('read', 'Actions/Img')) return;
if ($HasAccess <> '' && !$this->HasAccess('read', $HasAccess)) return;
.......
- Пример использования.
Я хотел бы запретить загрузку файлов с определенной страницы группе пользователей. Сейчас я могу это сделать только полность закрыв эту страницу.
- YuriMakarov Сюда же примыкает еще одна идея.
Условные экшены (это выше) и условные форматеры.
Про форматеры.
Если в вызов форматера добавить параметры (они могут быть и сами по себе полезны), и конкретно параметр HasAccess, то появляется возможность обработки по условию (наличию прав на чтение к примеру). Хорошо бы если в качестве значения HasAccess можно было бы использовать не страницу, а синтаксис из прав доступа к странице. Тогда можно было бы содержание страниц сделать зависимым от того, кто на нее смотрит.
Пример:
Размещаем на странице вызов форматера типа
%%(If HasAccess="$")
далее текст только для зарегистрированных пользователей
%%
или
%%(If HasAccess="!$")
только для незарегистрированных, или
%%(If HasAccess="@Club/Members")
только для членов клуба.
Сам форматер If должен просто вывести (без изменений) свое содержимое при наличии у пользователя прав.
В общем-то это и для других форматеров не помешало бы, пример
%%(php HasAccess="@Developers")
- RomanIvanov: Звучит интересно. Посмотрим, что скажет наш Ideologist, но вообще мне нравится.
- /Ku Me: да, прикольно. Немного гиково, но гибко зато, гибко, да. А параметры форматтерам давно пора.
Другой вариант жить
- Мы собирались это делать, да. И такой, как описан тут, вариант тоже обсуждался. У него есть один существенный недостаток неочевидность. То есть придётся пополнять список «концепций» ещё одной =) Другими словами, это хак.
- YuriMakarov Мне кажется этот вариант как раз очень очевиден и прост. И в реализации и в понимании. Да, добавляется еще одно концептуальное понятие использование страницы для контроля доступа (@ВикиИмя см. как там). Но оно может быть использовано очень широко в системе. Скажем у меня оно используется для создания Групп доступа (Ролей). Причем все в Ваке уже есть (для создания и редактирования этих списков), нужно только несколько строчек в скрипты добавить.
- Поэтому мы хотели сделать по-другому:
- Вака может работать не только с объектом «страница», но и с другими объектами.
- Для этого предусмотрено поле в БД и подкаталоги в handlers.
- Можно сделать action объектом соответствующего типа и написать для него хэндлеры show и edit.
- Впрочем, проблема «смешанных адресов» остаётся. Суть проблемы: по примерно-одинаковым-адресам типа /Actions / Include? и /Действия / Include? лежат совсем разные вещи права для экшна и «просто страница».
- YuriMakarov Да, я догадался что такая возможность (но и с другими объектами) заложена, но пока не представляю как это реализуется. И это ведь будет намного сложнее (во всех смыслах) чем предложенный вариант.
- RomanIvanov: Нет, не во всех. В плане понимания, почему это так проще. В плане реализации сложнее.
- /Ку Ме: я вот пока думаю, что не сложнее. Когда будет свободная ночь, сделаю один пример, потом дело пойдёт быстрее. (предыдущая свободная ночь у меня была, когда я сделал twiki-синтаксис, которого здесь ещё вроде не стоит? Yuri Makarov.Права Доступа