Права доступа
Право (permission) — разрешение на одно действие: «смотреть содержимое», «настраивать блог». Модуль объявляет права, а администратор раздаёт их ролям в панели. Код проверяет не роль пользователя, а наличие права — так один модуль работает на сайтах с любым набором ролей.
Где объявляют права
В файле blog.permissions.yml в корне папки модуля. Создайте его вручную:
# web/modules/custom/blog/blog.permissions.yml
administer blog:
title: 'Настраивать блог'Ключ — машинное имя права, обычная строка с пробелами. title — название, которое увидит администратор.
Выдача права
После drush cr откройте «Пользователи → Права доступа», адрес /admin/people/permissions. В группе Blog появится строка «Настраивать блог» с флажками для каждой роли. Отметьте нужную роль и сохраните. Роли «Администратор» по умолчанию автоматически достаются все права.
Проверка в маршруте
Замените общее право в маршруте настроек на своё:
# web/modules/custom/blog/blog.routing.yml
blog.settings:
path: '/admin/config/content/blog'
defaults:
_form: '\Drupal\blog\Form\SettingsForm'
_title: 'Настройки блога'
requirements:
_permission: 'administer blog'Теперь страницу настроек открывают только роли с правом administer blog. Остальные увидят «Доступ запрещён», а ссылка на страницу исчезнет для них из меню.
Несколько прав перечисляют в одной строке: через запятую — нужны все, через плюс — достаточно любого.
# web/modules/custom/blog/blog.routing.yml
requirements:
_permission: 'administer blog+administer site configuration'Описание и предупреждение
# web/modules/custom/blog/blog.permissions.yml
administer blog:
title: 'Настраивать блог'
description: 'Изменять заголовок списка и число статей на странице.'
restrict access: true
view blog subscribers:
title: 'Смотреть список подписчиков'description выводится под названием. restrict access: true добавляет предупреждение, что право стоит давать только доверенным ролям.
Проверка в коде
Иногда закрыть нужно не всю страницу, а её часть. В контроллере текущего пользователя возвращает метод currentUser():
// web/modules/custom/blog/src/Controller/BlogController.php
public function list(): array
{
$build['intro'] = ['#markup' => $this->config('blog.settings')->get('list_title')];
if ($this->currentUser()->hasPermission('view blog subscribers')) {
$build['admin'] = ['#markup' => '<p>Подписчиков: 12</p>'];
}
return $build;
}Строку о подписчиках увидят только те, у кого есть право. В хуках пользователя получают через \Drupal::currentUser().
| Метод | Что возвращает |
|---|---|
hasPermission('…') | Есть ли право |
isAuthenticated() | Вошёл ли пользователь на сайт |
isAnonymous() | Гость ли это |
id() | Номер пользователя, у гостя 0 |
getDisplayName() | Отображаемое имя |
Доступ к материалу
Право на конкретный материал зависит от автора, статуса публикации и модулей доступа, поэтому его спрашивают у самой сущности:
// web/modules/custom/blog/src/Controller/BlogController.php
if ($node->access('update')) {
// показать ссылку «Изменить»
}Операции: view, update, delete. Без второго аргумента проверка идёт для текущего пользователя.
Частая ошибка
Проверять роль — in_array('editor', $user->getRoles()) — плохая привычка: роли на каждом сайте свои, их переименовывают и добавляют. Объявите право и проверяйте hasPermission(), а кому оно положено, решит администратор сайта. И учтите: пользователь с номером 1 проходит любую проверку прав, поэтому тестируйте доступ под обычной учётной записью.