根据当前用户的角色是否与列出的角色匹配,编写重定向时遇到问题
我一直在寻找与获取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。当前,什么都没有发生,并且登录的用户可以看到该页面。
答案 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();
}
}