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


18

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

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

回答:


13

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

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


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
コードのみの回答は避けてください。それらは学習目的に役立ちません。少なくとも1つまたは3つの文で、この特定のコードがどの程度正確に答えであるかを説明してください。どのように機能しますか?なぜ機能するのですか?何度も何度も尋ねるのではなく、他の人が同じような状況で同じようなコードを書くのに役立つ説明の種類。
モウォ

これが正解です。
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編集制御、作成/更新/削除操作の制御に役立つ
ブライアン14

あなたのコードは私には機能しませんが、あなたは私を正しい方向に向けました。hook_node_accessのドキュメントapi.drupal.org/api/drupal/modules%21node%21node.api.php/に
Camilo

これは、Drupalがhook_node_accessフックを提供する一方で、mymodule_node_accessをカスタム関数として使用するため、悪い例です。これは混乱を招く可能性があります。
batigolix

@batigolix、答えで述べたように、ノードではなくノードページを保護する方法です。
ya.teck



0

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


0

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

Node View Permissionsモジュールを使用して確認します。コンテンツアクセスモジュールよりも簡単です。

D6と同様に、選択したコンテンツタイプに「コンテンツを表示」および「コンテンツを表示」権限が追加されます。

ここに画像の説明を入力してください

従うべき手順:

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

    できた!


drupalの8「ノードビュー権限」のために働いていない
カーティケヤンManivasagam

@KarthikeyanManivasagamどうですか?
クリスハッピー

このモジュールは、ロールとコンテンツタイプに基づいてコンテンツビューへのアクセスを提供する必要があるプロジェクトの1つで使用しましたが、まったく機能していません。このモジュールを使用しない場合と同じように動作します。
カーティケヤンマニバサガム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.