根据其内容类型限制哪些角色可以查看节点


18

我使用的是Drupal 7,创建了一个名为“ eBook”的新内容类型,并且创建了一个名为“ MonthlySubscriber”的新角色。我的意图是仅允许具有“ MonthlySubscriber”的用户查看“ eBook”节点。在查看角色的权限设置时,我看到了允许创建,编辑和删除该内容类型的节点的复选框,但是没有用于查看节点的复选框。

如何将可以查看“ eBook”节点的用户限制为仅具有“ MonthlySubscriber”角色的用户?

Answers:


13

您需要安装Content Access模块才能添加此访问控制。

该模块允许您按角色和作者管理内容类型的权限。它允许您指定每种内容类型的自定义视图,编辑和删除权限。


5

对于drupal 7,请尝试使用hook_node_access()

/**
 * Implements hook_node_access().
 */
function YOURMODULE_node_access($node, $op, $account) {
  if (
    $node->type == 'ebook' &&
    $op == 'view' &&
    !in_array('MonthlySubscriber', $account->roles)
  ) { return NODE_ACCESS_DENY; }
  return NODE_ACCESS_IGNORE;
}

1
请避免仅使用代码的答案。他们没有任何学习目的。至少用一句话或三句话来解释这个特定代码到底是如何答案的?它是如何工作的?为什么有效?一种描述,它将帮助其他人在类似情况下编写相似的代码,而不是一次又一次地询问。
Mołot

这应该是正确的答案。
GrafiCode

5

这是一种保护节点页面(节点/ NID)不受特权用户访问的简单方法。

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_check_node_access';
}

/**
 * Determines whether the current user may perform the operation on the node.
 */
function mymodule_check_node_access($op, $node) {
  if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
    return FALSE;
  }
  return node_access($op, $node);
}

2
请注意,使用hook_node_access将不适用于“列出”节点的任何对象,例如视图。因此,您可以在中限制视图访问hook_node_access,但是视图或自定义节点查询仍然可以向用户显示该节点。hook_node_access对编辑控制,控制创建/更新/删除操作更有用
Brian

您的代码对我不起作用,但是您为我指明了正确的方向。我在hook_node_access文档api.drupal.org/api/drupal/modules%21node%21node.api.php/
Camilo

这是一个不好的例子,因为它使用mymodule_node_access作为自定义函数,而Drupal提供了hook_node_access钩子。这可能会造成混乱。
batigolix

如答案中所述,@ batigolix是一种保护节点页面而非节点的方法。
ya.teck


1

对于drupal 7,请尝试以下一项:按条款访问

为D7提供非常灵活的分层节点访问控制(内容访问控制)。


0

ya.teck上面发布的hook_menu_alter解决方案确实可以工作,但是与函数名称中的标准hook_node_access冲突。在这种情况下,不需要hook_menu_alter,因此我认为上面Denis发布的答案更准确,更正确。像第一个引用的示例那样更改menu_item可能会被管道下方的另一个模块破坏。


0

我使用了D7 API文档中的hook_node_access hook的代码段。

此代码将向具有“查看电子书”权限的用户授予查看“电子书”内容的访问权限。

您需要新的权限才能通过实现hook_permission()来控制访问。

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

通过实现hook_node_access(),Drupal可以授予或拒绝对该节点的访问。

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {

  // Checks for an ebook node in view mode.
  if (is_object($node) && $node->type === 'ebook' && $op === 'view') {

    // Grants permission to view the node if the current user has an role
    // with the permission 'view ebook'.
    if (user_access('view ebook')) {
      return NODE_ACCESS_ALLOW;
    }

    // Otherwise disallows access to view the node.
    return NODE_ACCESS_DENY;
  }
  // For all other nodes and other view modes, don't affect the access.
  return NODE_ACCESS_IGNORE;
}

其他权限(编辑,删除等)可以通过正常的Drupal权限来处理。

(可选)您可以通过实现hook_query_TAG_NAME_alter从管理员概述中删除内容。

/**
 * Implements hook_query_TAG_NAME_alter().
 */
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
  if (!user_access('view ebook')) {
  $query->condition('n.type', 'ebook', '!=');
  }
}

0

我使用“ 节点视图权限”模块。它比“内容访问”模块简单。

与D6中一样,它向您选择的任何内容类型添加“查看任何内容”和“查看自己的内容”权限。

在此处输入图片说明

遵循的步骤:

  1. 安装并启用后,转到 /admin/config/content/node-view-permissions并选择您要限制访问的内容类型。
  2. 然后,转到/admin/people/permissions#module-node_view_permissions 并选择您希望能够查看内容的角色。保存权限。

    做完了!


对于drupal 8“节点视图权限”不起作用
Karthikeyan Manivasagam

@KarthikeyanManivasagam怎么回事?
克里斯·

我们在一个项目中使用了此模块,在该项目中,我们需要根据角色和内容类型提供内容视图访问权限,但根本无法正常工作。它的行为与未使用此模块的情况相同。
Karthikeyan Manivasagam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.