Рейтинг:2

Вернуть AccessDenied для пользовательской страницы

флаг mw

Я настроил пользовательскую страницу в своей системе, которая ожидает 2 параметра, которые будут использоваться для создания части контента на этой странице, я могу получить информацию со своей страницы, но мне интересно, что лучше метод возврата отказа в доступе, когда мои критерии терпят неудачу

я нашел эта страница который показывает, как вы можете настроить собственный контроллер доступа, но этот пример передает сущность пользователя, когда меня больше интересуют «слаги» URL-адреса, на который они нажали.

маршрутизация.yml

мой_модуль.user_subscribe:
  путь: /my-module/subscribe/{entity_type}/{entity_id}
  значения по умолчанию:
    _controller: \Drupal\my-module\Controller\SubscriptionPages::subscribe
    _title: Подписка по электронной почте прошла успешно
    тип: узел
    сущность: 1
  требования:
    _permission: 'доступ к содержимому'
    _entity_check: «ИСТИНА»

Services.yml

Сервисы:
  мой_модуль.entity_check:
    класс: Drupal\мой-модуль\Access\EntityCheck
    теги:
      - {имя: access_check, apply_to: _entity_check}

Тогда у меня есть мой src/контроллер/страницы подписки файл и один для src/Access/EntityCheck и т. д., кажется, что вся эта часть работает, я могу вручную принудительно применить код в моем EntityCheck, чтобы вернуть отказ в доступе, и это так, но я хочу знать, как я могу вытащить {тип объекта} и {entity_id} по URL-адресу, который они нажали, чтобы я мог убедиться, что они не пытаются получить доступ к чему-то, чего им не следует

например

mywebsite.com/my-module/subscribe/node/15 — подойдет

mywebsite.com/my-module/subscribe/foo/bar — вернет отказ в доступе, потому что я хочу запустить проверку внутри своего кода EntityCheck

Внутри ссылки выше есть аргументы: ['@current_user'] внутри файла services.yml есть ли эквивалент для текущего URL-адреса или те, где я могу более конкретно получить каждый из элементов по отдельности?

Рейтинг:3
флаг de

На вашем маршруте вместо _разрешение, вы можете использовать настраиваемый обратный вызов доступа:

_custom_access: Drupal\[МОДУЛЬ]\Контроллер::accessCallback()

Затем вы можете вернуть AccessResult из обратного вызова доступа:

общедоступная функция accessCallback($entity_type, $entity_id) {
  если (!in_array($entity_type, $allowed_types)) {
    return \Drupal\Core\Access\AccessResult::forbidden();
  }

  ...

  return \Drupal\Core\Access\AAccessResult::neutral();
}

Или вы можете использовать _разрешение на маршруте, а вместо этого бросить Symfony\Component\HttpKernel\Exception\NotFoundHttpException исключение из контроллера, если значения неверны:

публичная функция someRouteCallback($entity_type, $entity_id) {
  if (!$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($entity_id)) {
    бросить новый \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
  }
}
Andrew Morris avatar
флаг mw
О, отлично, даже лучше, спасибо
4uk4 avatar
флаг cn
Имейте в виду, что обратные вызовы доступа могут вызываться по разным причинам, и они должны возвращать результат доступа, а не воздействовать на него. Вы можете бросить исключение в самом контроллере, это не проблема, но это не идеально. Это должно иметь обратный вызов доступа, возвращающий результат доступа, тогда любой код, проверяющий доступ к маршруту, работает так, как должен.
Jaypan avatar
флаг de
Упс. Спасибо, я смешивал вещи. Я обновил пост соответственно. Эндрю Моррис, вы должны просмотреть мои обновления и соответствующим образом изменить свой код.

Ответить или комментировать

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