Как написать перенаправление на основе роли пользователя? - PullRequest
0 голосов
/ 24 июня 2019

У меня проблема с написанием перенаправления, основанного на том, совпадает ли роль текущего пользователя с перечисленной или нет

Я пытался найти решения, связанные с получением текущего пути для Drupal.8. Я не уверен, является ли это одной из проблем или нет.

class FacultyStaffRedirectSubscriber implements EventSubscriberInterface {


  public function checkForRedirection(GetResponseEvent $event) {
    $request = \Drupal::request();
    $requestUrl = \Drupal::service('path.current')->getPath();
    $current_user = \Drupal::currentUser();
    $roles = $current_user->getRoles();

    if ($requestUrl == '/faculty-staff') {
        if (
          !in_array('faculty', $roles) ||
          !in_array('staff', $roles)
        ) {

            $path =  '/404'; // \Drupal::service('path.alias_manager')->getAliasByPath('/404')
        $response = new RedirectResponse($path);
        $response->send();
        return;
          /* $event->setResponse(new RedirectResponse($path, 302)); */
            }
    }
  }
 public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkForRedirection');
    return $events;
  }

} 

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

1 Ответ

0 голосов
/ 18 июля 2019

Если я правильно понял, вы хотите вернуть ошибку 404 или 403, если у пользователя нет прав на просмотр страницы.Есть много вариантов сделать это.Я перечисляю только несколько.

Среди предоставленных модулей я обычно использую разрешение по термину .Вы можете просто добавить поле термина к своему контенту, установить полномочия роли для каждого термина, и вы готовы к работе (для получения дополнительной информации обратитесь к их документам и учебным пособиям).Для более сложных структур есть органических групп , но обычно это избыточно для большинства случаев (но это очень крутой модуль).Есть много других модулей, таких как:

Для пользовательских маршрутов вы можете просто определить разрешение на доступ и дать это разрешение надлежащемуrole:

e_index.content:
  path: '/your/path'
  defaults:
    _title: 'Title'
  requirements:
    _permission: 'your permission'

Вы можете использовать hook_node_access () или hook_entity_access (), если ваш путь представляет сущность.

/**
 * Implements hook_node_access().
 */
function yourmodule_node_access(\Drupal\node\NodeInterface $node, $op, \Drupal\Core\Session\AccountInterface $account) {

  if ($your_condition) {
    ...
    $access_value = TRUE/FALSE;
  }

  if ($access_value === TRUE) {
    $access = new AccessResultAllowed();
  } elseif ($access_value === FALSE) {
    $access = new AccessResultForbidden();
  } else {
    $access = new AccessResultNeutral();
  }

  $access->addCacheableDependency($node);
  return $access;
}

Или вы можете просто вызвать исключение Symfony:

use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class MyClass {

  public fucntion myMethod() {
    throw new AccessDeniedHttpException();
    // or
    throw new NotFoundHttpException();
  } 
}
...