====== Контроль доступа с помощью списков доступа (ACL)======
«[[dokuwiki|Докувики]]», как и большинство других вики, по умолчанию очень открыто. Каждому позволено создавать, редактировать и удалять статьи.
Однако, иногда имеет смысл ограничить доступ к определённым или всем статьям. Именно в этом случае «выходят на сцену» //списки доступа// (ACL). Данная статья делает обзор как ACL функционируют в «ДокуВики» и как их конфигурировать.
**Предупреждение:** Функционал ACL включён в «ДокуВики» достаточно давно и должен быть довольно стабилен. Однако, если вас особенно беспокоит риск того, что неавторизованные пользователи получат доступ к информации вашей вики, вы никогда не должны оставлять её на компьютерах, доступ к которым разрешён из открытого интернета...
===== Установка и конфигурация =====
ACL могут быть включены во время работы [[installer|установщика]] и тогда будет установлена стандартная начальная политика ACL.
Для ручного включения ACL установите опцию [[.:config:useacl]] и скопируйте файлы ''conf/acl.auth.php.dist'' и ''conf/users.auth.php.dist'' в ''conf/acl.auth.php'' и ''conf/users.auth.php'' соответственно.
Пример минимального файла ''%%conf/users.auth.php%%'' для пользователя ''admin'' с паролем ''admin''. Если вы используете его, обязательно измените пароль после этого.
# Логин:Хэш пароля:Настоящее имя:email:Группы, через зяпятую
admin:$2y$10$P5YH8uIM2uAE9snRq32yAuHMb4/XAzksFd5Cakqqtsw9BWeSsyLZq:admin:admin@admin.com:admin,user
==== См. также ====
Есть ещё несколько опций конфигурации и функциональных свойств, относящихся к ограничениям прав пользователей и настройкам ACL. Пожалуйста, обратитесь к следующим статьям за более детальной информацией:
* Опция конфигурации [[.:config:useacl]] --- разрешить ACL.
* Опция конфигурации [[.:config:superuser]] --- назначение суперпользователей.
* Опция конфигурации [[.:config:disableactions]] --- позволяет вам запретить открытую регистрацию.
* Опция конфигурации [[.:config:defaultgroup]] --- группа, к которой по умолчанию приписывается новый пользователь.
* [[:plugin:usermanager|Менеджер пользователей]] --- управление пользователями.
* [[auth|Бэк-энды аутентификации]] --- идентифицируют пользователей по разным источникам.
* [[faq:regdisable|FAQ: Как отключить открытую регистрацию пользователей]].
===== Ограничение доступа =====
Ограничения доступа могут быть привязаны к [[pagename|статьям]] и [[namespaces|пространствам имён]].
Есть семь уровней доступа: //никаких (none)//, на //чтение (read)//, //изменение (edit)//, //создание (create)//, //загрузку (upload)//, //удаление (delete)// и //администрирование (admin)//.
У //<<чтения>>// самый низкий уровень доступа, у //<<удаления>>// --- самый высокий. Если разрешён один уровень доступа (например, //создание//), то и все более низкие (//чтение// и //изменение//) так же разрешены. Следует отметить, что //<<создание>>//, //<<загрузка>>// и //<<удаление>>// относятся только к пространствам имён.
Правила, установленные для пространств имён, применяются и к пространствам имён медиафайлов точно также, как и к пространствам имён статей.
Когда система «ДокуВики» определяет права конкретного пользователя для доступа к конкретной статье, она выбирает из всего списка правил одно, согласно следующей процедуре:
* выбираются все правила, для которых выполняется условие ''<пользователь или группа>'', т. е., либо имя пользователя совпадает с указанным, либо, если указана группа, то пользователь принадлежит этой группе. Остальные правила <<выбрасываются>> из рассмотрения.
* из оставшихся в рассмотрении выбирается правило, для которого наилучшим образом выполняется условие '''', это мы называем specific matching (более специфичное совпадение).
* если в нескольких правилах происходит совпадение с условием '''' в одинаковой мере, то выбирается правило с наибольшим ''<уровнем доступа>''.
Пользователи входят в группы, к которым они были приписаны менеджером пользователей (или бекэндом аутентификации). Однако есть две специальные **группы:**
* **@ALL**. Все пользователи, даже не совершившие вход в систему, являются членами группы ALL. Вы можете использовать эту группу для того, чтобы ограничить права для всех пользователей по умолчанию и ослабить это ограничение для нескольких выбранных пользователей.
* **@user**. Все пользователи, зарегистрировавшие себя, по умолчанию автоматически являются членами группы user. Используйте эту группу для назначения прав пользователям, совершившим вход в систему. Название данной группы задаётся в опции [[.:config:defaultgroup]]. В отличие от виртуальной группы ALL, user --- это реальная группа, в которую автоматически добавляются все зарегистрированные пользователи при условии, что для авторизации используется plain backend. Если вы используете другой бэк-энд, вам нужно использовать группы предоставляемые этим бекэндом.
Представление групп внутри системы и в менеджере ACL отличается тем, что перед именем группы ставится символ <<@>>.
==== Редактирование ACL ====
Наиболее простой способ добавить новое или отредактировать существующие правила, это использовать [[plugin:acl|менеджер ACL]], доступный из панели администратора.
Доступно [[plugin:acl|детальное описание]] этого интерфейса.
Обычно необходимо совершить три шага для добавления нового правила ACL:
- выберите пространство имён или статью, на которые накладываются ограничения, из дерева навигации, расположенного вверху слева;
- выберите, к кому это правило ACL должно применяться:
* либо отметив уже существующего пользователя или группу из выпадающего меню;
* либо выбрав тип (User: или Group:) и введя имя (пользователя или группы) в соответствующем поле;
- установите подходящие права доступа.
Существующие правила могут быть изменены или удалены в таблице, приведенной внизу окна менеджера ACL.
==== Правила ACL в примерах ====
В этом разделе мы объясним как работают правила доступа, используя фиктивный пример настроек, которые в менеджере ACL выглядят следующим образом:
{{:aclexample.png?nolink|Пример первый}}
Рассмотрим каждую из строк:
- Эта строка устанавливает права для всех в основном пространстве имён, позволяя каждому редактировать и создавать статьи. Однако загрузка файлов на сайт не разрешена.
- Пользователю //bigboss// предоставлены все права.
- Теперь доступ к пространству имён ''devel'' ограничен. Всем запрещено делать что-либо.
- Ну хорошо, на самом деле, не всем --- мы дали членам группы //devel// полные права здесь.
- И конечно //bigbossу// тоже позволено --- и он единственный, кто может удалять загруженные файлы.
- А команда //marketing// может читать всё в пространстве имён, но только читать.
- Однако ребята из ''devel'' не хотят, чтобы их босс видел статью ''funstuff'' --- помните, что правило, точно соответствующее статье, <<перебивает>> правило, относящееся к пространству имён.
- И, наконец, ребятам из группы //marketing// также позволено редактировать статью ''devel:marketing''.
- Далее установлены права для пространства имён ''marketing''. Всем членам группы ''marketing'' позволено загружать сюда файлы
* для остальных пользователей срабатывает правило **1,** поэтому они всё ещё могут создавать и редактировать статьи здесь.
* //bigboss// наследует свои права из строки **2,** поэтому может загружать файлы сюда и удалять их.
- Наконец, последняя строка ограничивает доступ к начальной статье для всех только на чтение, только суперпользователь может хотя бы редактировать её.
Давайте взглянем на второй пример, чтобы лучше понять **specific matching** (более специфичное совпадение):
{{:aclexample2.png?nolink|Пример второй}}
На этот раз мы разберём, какие правила выберутся для разных пользователей при их попытке получить права к статье ''private:bobspage''.
- для обычного пользователя //abby//:
* условие ''<пользователь или группа>'' выполняется в трёх правилах: №1, №2 и №4.
* условие '''' лучше всего (другими словами: более конкретно) выполняется в правиле №4.
* согласно правилу №4 уровень доступа пользователя //abby// к статье '''' определяется 0, т. е. у //abby// нет никакого доступа к этой статье.
- для обычного пользователя //bob//:
* условие ''<пользователь или группа>'' выполняется в четырех правилах: №1, №2, №4 и №6.
* условие '''' лучше всего выполняется в правиле №6. (Скажу больше, тут '''' **точно** совпадет со статьей)
* уровень доступа //bobа//: 16.
- //bob// забыл войти в систему и пытается как неавторизованный пользователь получить доступ к своей статье:
* условие ''<пользователь или группа>'' выполняется в двух правилах: № 1 и № 4.
* условие '''' лучше всего выполняется в правиле № 4.
* уровень доступа: 0.
- для пользователя //charlie,// который входит в группу staff:
* условие ''<пользователь или группа>'' выполняется в пяти правилах: с №1 по №5.
* условие '''' лучше всего выполняется в двух правилах №4 и №5, но в правиле №5 ''<уровнем доступа>'' выше.
* уровень доступа //charlie//: 16.
Заметим следующее: могло бы показаться, что правило №5 дублирует правило №3, но без пятого правила члены группы staff не получили бы доступ к пространству имён private, т. к. этому препятствовало бы правило №4.
===== Информация о внутреннем представлении ACL =====
Ограничения доступа хранятся в файле ''conf/acl.auth.php'', который должен быть доступен для записи веб-серверу, если вы хотите использовать интерфейс администрирования ACL.
:!: Не рекомендуется вручную править этот файл, вместо этого используйте интерфейс администратора.
Пустые строки и комментарии, начинающиеся с символа <<#>>, игнорируются.
Каждая строка содержит три поля разделенных пробелами:
* Ресурс, на который накладывается ограничение. Это может быть [[pagename|статья]] или [[namespace|пространство имён]]. Пространства имен отмечаются дополнительной звездочкой (см. пример ниже).
* Имя пользователя или группы. Имя группы отмечается символом <<@>> в начале.
* Уровень доступа (см. ниже).
Существует 7 уровней доступа. Они представляются целыми числами. Более высокий уровень включает в себя все более низкие. Если вы можете редактировать, то вы также автоматически можете читать. Есть уровень доступа //admin// (соответствует числу //255//), который никогда не должен использоваться в файле ''conf/acl.auth.php''. Он используется только внутри системы при сравнении с опцией [[.:config:superuser]].
^ Имя ^ Уровень ^ Применимо к... ^ Права доступа ^ Константа в исходниках «Докувики» ^
| none | 0 | статьи, простр. имён | нет доступа --- полный запрет | AUTH_NONE |
| read | 1 | статьи, простр. имён | право на чтение | AUTH_READ |
| edit | 2 | статьи, простр. имён | можно изменять существующие статьи | AUTH_EDIT |
| create | 4 | простространства имён | можно создавать новые статьи | AUTH_CREATE |
| upload | 8 | простространства имён | можно загружать медиафайлы | AUTH_UPLOAD |
| delete | 16 | простространства имён | можно заменять или удалять медиафайлы | AUTH_DELETE |
| admin | 255 | плагин admin | суперпользователь((Cм. [[.:config:superuser]])) может изменять настройки | AUTH_ADMIN |
Вот пример представления, которое совпадает с первым примером, приведённому выше:
* @ALL 4
* bigboss 16
devel:* @ALL 0
devel:* @devel 8
devel:* bigboss 16
devel:* @marketing 1
devel:funstuff bigboss 0
devel:marketing @marketing 2
marketing:* @marketing 8
start @ALL 1
Пожалуйста запомните, что **порядок не имеет значения.** Файл обрабатывается целиком, когда ищется наиболее подходящие правило для текущей связки <<статья---пользователь>>. Если такое правило найдено, дальнейшие поиски прекращаются. Если не найдено, проводится проверка на совпадение связки <<статья---группа>> для всех групп, членом которых является текущий пользователь. Если и тут совпадений нет, то поиск проводится для следующего уровня пространства имён данной статьи. И т. д., пока не достигнем правила со связкой <<*/@ALL>>.
**Замечание:** право на //удаление (delete)// относится только к медиафайлам. Статьи могут быть удалены (и восстановлены) любым пользователем, имеющим право на //редактирование (edit)//. Пользователь, у которого есть права на //загрузку (upload)//, но нет права на //удаление (delete)//, также не может переписать существующие медиафайлы.
==== Кодировка пользователя / группы ====
Если в имени пользователя или группы должны быть спецсимволы (такие, как пробел, например), то они (символы) должны быть преобразованы точно также, как они преобразуются в соглашениях об URL. Это относится только к спецсимволам с ASCII-кодами ниже 128. Файл ACL использует кодировку UTF-8, поэтому могут использоваться любые многобайтовые символы в том виде как они есть.
Пример: ''Herbert.Müller'' становится ''Herbert%2eMüller''
(Это относится только к случаям, когда используется бэк-энд, отличный от <<[[auth:plain]]>>; <> в любом случае не допускает спецсимволы нигде.)
==== Подстановки имён пользователей ====
Есть возможность использовать **подстановки имён пользователей** (user wildcards) в списках доступа. Это может быть полезным в вики c большим количеством зарегистрированных пользователей, если вы хотите дать каждому пользователю персональное пространство имён, в котором только он имел бы доступ на редактирование, и если вы не хотите при этом редактировать ACL для каждого пользователя. А достичь это позволяет то, что подстановка ''%USER%'' заменяется на имя пользователя, который в данный момент <<залогинен>> в системе и %GROUP% все группы этого пользователя.
В этом случае зарегистрированный пользователь имеет доступ только к собственному пространству имен и не имеет доступа к пространствам имен других пользователей (даже к просмотру названий пространств имен других пользователей).
#
# Предоставить полный доступ к пространству имен пользователя, вошедшего всистему
user:%USER%:* %USER% 16
#
# Разрешить просматривать собственное пространство имен через "все страницы":
user: %USER% 1
#
# Разрешить доступ только для чтения к странице "start", расположенной в пространстве имен "user"
user: start %USER% 1
#
# Отключить весь доступ к домашним пространствам имен пользователя, не принадлежащим зарегистрированному пользователю
# (включая просмотр пространств имен через "все страницы")
user:* @user 0
#
# Разрешить членам "group" редактировать страницы в пространстве имен "group".
# БУДЬТЕ ОСТОРОЖНЫ, если у вас есть пространство имен "user", все члены группы по умолчанию
# получит к нему доступ, поскольку %GROUP% будет заменен буквально
%GROUP%:* %GROUP% 2
**Замечание:** Не так давно для обозначения подстановок использовался символ <<@>> (<<собака>>). В более новых версиях он заменен на <<%>> (процент). Если вы обновляетесь со старой версии, то вы должны привести установки ACL в соответствие с этим.