如何编写基于用户角色的重定向?

时间:2019-06-24 19:07:58

标签: php drupal drupal-8

根据当前用户的角色是否与列出的角色匹配,编写重定向时遇到问题

我一直在寻找与获取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 :(得分:0)

如果我正确理解了这个问题,那么如果用户无权查看该页面,则您将返回404或403错误。有很多选项可以做到这一点。我只列出了几个。

在我通常使用的permission by term贡献模块中。您只需在您的内容中添加术语字段,为每个术语设置角色权限,就可以开始使用(查看其文档和教程以获取更多信息)。对于更复杂的结构,有organic groups,但是通常在大多数情况下这是过大的了(但它是非常酷的模块)。还有很多其他模块,例如:

对于自定义路由,您只需确定访问权限并将该权限授予适当的角色即可:

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();
  } 
}