Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Права доступа

Право (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 проходит любую проверку прав, поэтому тестируйте доступ под обычной учётной записью.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.