Ограничение доступа к контроллерам Drupal 8

Контроллеры в Drupal 8 являются эквивалентом hook_menu в Drupal 7. Контроллер позволяет вам определять URL-адрес и то, какой контент или данные должны отображаться по данному URL-адресу.Ограничение доступа к некоторым url вашего сайта важно, потому что оно определяет, кто может и не может видеть страницу.

Контроллеры определены в файле YAML с именем module_name.routing.yml. Правила доступа и разрешения определены в файле module_name.routing.yml в разделе _requirements. Большинство примеров кода будут взяты из файла module_name.routing.yml, добавленного в my_module на верхнем уровне.

Примечание. Существует множество документов о том, как создавать контроллеры в Drupal 8, поэтому я не буду здесь останавливаться на этом.

Ограничение по разрешению


В этом случае предоставляется разрешение со страницы разрешений Drupal. Разрешения можно найти в / admin / people / permissions . Установите точные разрешения в файле предоставляющем разрешение, кторый естественно нужно будет создать, если он еще не создан module.permissions.yml,

my_module.dashboard:
  path: 'dashboard'
  defaults:
    _controller: '\Drupal\my_module\Controller\DashboardController::content'
    _title: 'Dashboard'
  requirements:
    _permission: 'access content'

Ключевое определение YAML:


_role: 'РОЛЬ ИМЯ'
Вы можете указать несколько ролей, используя «,» для И и «+» для логики ИЛИ.


Ограничение одноразовым пользовательским кодом


В тех случаях, когда у вас есть пользовательские требования доступа, добавление метода доступа к контроллеру может иметь смысл. В этом примере страница не должна просматриваться до указанной даты.

my_module.dashboard:
  path: 'dashboard'
  defaults:
    _controller: '\Drupal\my_module\Controller\DashboardController::content'
    _title: 'Dashboard'
  requirements:
   _custom_access: '\Drupal\my_module\Controller\DashboardController::access

Ключевое определение YAML:

_custom_access: '\ Drupal \ my_module \ Controller \ DashboardController :: access


Метод доступа в моем контроллере будет выглядеть так:

<?php
namespace Drupal\my_module\Controller;
 
use Drupal\Core\Access\AccessResult; 
use Drupal\Core\Controller\ControllerBase;
 
/**
 * Определяет контроллер Dashboard. 
 */
class DashboardController extends ControllerBase { {
 
 /**
  * Возвращает содержимое для этого контроллера. 
  */
 public function content() {
   $build = [];
   return $build;
 }
 
 /**
  * Проверяет доступ для этого контроллера. 
  */
 public function access() {
   // Не разрешать доступ до пятницы, 25 марта 2019 года. 
   $today = date("Y-m-d H:i:s");
   $date = "2019-03-25 00:00:00";
   if ($date < $today) {
     // Вернуть страницу 403 Доступ запрещен. 
     return AccessResult::forbidden();
    }
    return AccessResult::allowed();
  }
}

Ограничение по службе пользовательского доступа


Это похоже на метод доступа в вашем контроллере, но позволяет повторно использовать код на многих контроллерах. Это идеально, когда вы выполняете одну и ту же проверку доступа на нескольких контроллерах.

my_module.dashboard:
  path: 'dashboard'
  defaults:
    _controller: '\Drupal\my_module\Controller\DashboardController::content'
    _title: 'Dashboard'
  requirements:
    _custom_access_check: 'TRUE'


Ключевое определение YAML:

 

_custom_access_check: 'TRUE'


Для проверки сервиса  _custom_access_check необходимо создать два файла в my_module.

my_module / my_module.services.yml (определяет сервис Access и где найти наш класс Access)

services:
  my_module.custom_access_check:
    class: Drupal\my_module\Access\CustomAccessCheck
    arguments: ['@current_user']
    tags:
      - { name: access_check, applies_to: _custom_access_check }


my_module / SRC / Access / CustomAccessCheck.php

<?php
namespace Drupal\my_module\Access;
 
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;
 
/**
 * Class CustomAccessCheck.
 *
 * @package Drupal\my_module\Access
 */
class CustomAccessCheck implements AccessInterface {
 
  /**
   * A custom access check.
   *
   * @param \Drupal\Core\Session\AccountInterface $account
   *   Run access checks for the logged in user.
   */
  public function access(AccountInterface $account) {
    //  У пользователя есть поле профиля, определяющее его любимый цвет.
    if ($account->field_color->hasField() && !$account->field_color->isEmpty() && $account->field_color->getString() === 'blue') {
      // Если любимый цвет пользователя синий, дай им доступ. 
      return AccessResult::allowed();
    }
    return AccessResult::forbidden();
  }
 
}


Хотя приведенное выше охватывает некоторые из наиболее полезных способов ограничения доступа к контроллеру, существуют дополнительные параметры. 

Теги

Добавить комментарий

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Оставьте комментарий!