web-dev-qa-db-ja.com

コンテンツタイプに基づいてノードを表示できるロールを制限する

Drupal 7を使用していて、「eBook」という新しいコンテンツタイプを作成し、「MonthlySubscriber」という新しいロールを作成しました。私の意図は、「MonthlySubscriber」を持つユーザーのみを許可することです「eBook」ノードを表示するロールの権限設定を確認したところ、そのコンテンツタイプのノードを作成、編集、削除できるチェックボックスが表示されましたが、ノードを表示するためのチェックボックスがありません。

「eBook」ノードを表示できるユーザーを「MonthlySubscriber」ロールを持つユーザーのみに制限するにはどうすればよいですか?

17
John

このアクセス制御を追加するには、 コンテンツアクセス モジュールをインストールする必要があります。

このモジュールを使用すると、ロールおよび作成者ごとにコンテンツタイプの権限を管理できます。これにより、各コンテンツタイプのカスタム表示、編集、および削除権限を指定できます。

13
iStryker

これは、権限のないユーザーからノードページ(ノード/ 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);
}
5
ya.teck

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;
}
5
Denis

Drupal 7のインストールではコンテンツアクセスが機能しなかったため、代わりに Node View Permissions を使用しました。

2
Sam King

drupal 7の場合、これを試してください: 用語によるアクセス

D7に対して、非常に柔軟な階層型ノードアクセス制御(コンテンツアクセス制御)を提供します。

1
washooo

上記のya.teckによって投稿されたhook_menu_alterソリューションは機能しますが、関数名が標準のhook_node_accessと競合します。この場合、hook_menu_alterは必要ありません。そのため、上記のDenisによって投稿された答えは、私の意見ではより正確で適切な方法です。行われるようにmenu_itemを変更することは、最初の参照例であり、パイプのさらに下の別のモジュールによって破壊される可能性があります。

0
ben.hamelin

Node View Permissions モジュールを使用します。コンテンツアクセスモジュールよりもシンプルです。

D6と同様に、選択したコンテンツタイプに「コンテンツの表示」と「自分のコンテンツの表示」の権限を追加します。

enter image description here

従うべき手順:

  1. インストールして有効にしたら、/admin/config/content/node-view-permissionsに移動して、アクセスを制限するコンテンツタイプを選択します。
  2. 次に、/admin/people/permissions#module-node_view_permissionsに移動し、コンテンツを表示できるようにするロールを選択します。権限を保存します。

    できた!

0
Chris Happy

hook_node_accessフック については、D7 APIドキュメントにあるコードスニペットを使用しました。

このコードは、「ebookの表示」権限を持つユーザーに「ebook」コンテンツの表示へのアクセスを許可します。

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
batigolix