Answers:
您可以在钩子hook_node_access()中控制对节点的访问:
mymodule.module:
use Drupal\node\NodeInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
function mymodule_node_access(NodeInterface $node, $op, AccountInterface $account) {
if ($account->isAnonymous() && $node->gettype() == 'article') {
return AccessResult::forbidden()->cachePerPermissions();
}
return AccessResult::neutral()->cachePerPermissions();
}
这控制对节点的直接访问,而不控制视图中的访问。但这就是您可能想要的。
最好的选择是使用Rabbit Rabbit或Content Access(它具有更新的发行版)。
Rabbit Hole是一个模块,它增加了控制在其自己的页面上查看实体时应该发生的情况的功能。也许您有一种内容类型,它永远都不应显示在其自己的页面上,例如轮播中显示的图像内容类型。Rabbit Hole可以阻止通过node / xxx在其自己的页面上访问此节点。
该模块允许您按角色和作者管理内容类型的权限。它允许您指定每种内容类型的自定义视图,编辑和删除权限。(可选)您可以启用每个内容访问设置,以便可以自定义每个内容节点的访问。
请注意,我相信您想要的是阻止对内容类型的节点的所有访问-并且只有Content Access才能在Rabbit Hole上实现。
除此之外,如果这两种方法都不适合,您可能会考虑实现自己的访问控制。
也许您想尝试使用“ 组”模块,该模块允许在您的站点上创建内容和用户的任意集合,并授予对这些集合的访问控制权限。它自D7起可用,并且还具有D8版本。它将组创建为实体,使其完全可现场使用,可扩展和可导出。每个组都可以具有附加的用户,角色和权限(有关该组的更多详细信息,请参阅“ 组模块支持哪些角色? ”)。
对于此特定问题,您将启用gnode
子模块,并针对每种组类型为各种内容类型定义适当的权限(查看,编辑,删除等)。
似乎您想授予对“组”中称为“成员”和“外部人员”(=不是组成员的登录用户)的访问权限。但是您将不允许访问“匿名”(未登录的站点访问者)。
您可以使用“ 节点视图权限”模块。
启用它,然后您可以在“节点查看权限”部分下的路径“ admin / people / permissions”下分配哪些角色可以查看哪些内容类型