web-dev-qa-db-fra.com

Limiter les rôles pouvant afficher un nœud en fonction de son type de contenu

J'utilise Drupal 7 et j'ai créé un nouveau type de contenu appelé "eBook" et j'ai créé un nouveau rôle appelé "MonthlySubscriber". Mon intention est de n'autoriser que les utilisateurs disposant du "MonthlySubscriber" pour afficher les nœuds "eBook". Lorsque j'ai examiné les paramètres d'autorisation pour un rôle, j'ai vu les cases à cocher qui permettent de créer, modifier et supprimer des nœuds de ce type de contenu, mais il n'y a pas de cases à cocher pour afficher les nœuds.

Comment limiter les utilisateurs qui peuvent afficher les nœuds "eBook" aux seuls utilisateurs ayant le rôle "MonthlySubscriber"?

17
John

Vous devez installer le module Content Access pour ajouter ce contrôle d'accès.

Ce module vous permet de gérer les autorisations pour les types de contenu par rôle et auteur. Il vous permet de spécifier des autorisations d'affichage, de modification et de suppression personnalisées pour chaque type de contenu.

13
iStryker

Voici un moyen simple de protéger les pages de nœuds (nœud/NID) contre les utilisateurs non privilégiés.

/**
 * 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

Pour drupal 7, essayez d'utiliser 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

L'accès au contenu n'a pas fonctionné pour mon Drupal 7 installation, j'ai donc utilisé Node View Permissions à la place.

2
Sam King

Pour drupal 7, essayez celui-ci: Accès par terme

Fournit un contrôle d'accès aux nœuds très flexible et hiérarchique (contrôle d'accès au contenu), pour D7.

1
washooo

La solution hook_menu_alter publiée ci-dessus par ya.teck fonctionne, mais entre en conflit avec le hook_node_access standard dans son nom de fonction. le hook_menu_alter n'est pas requis dans ce cas, et donc la réponse postée par Denis ci-dessus est à mon avis plus précise et la bonne manière. Modifier le menu_item comme cela est fait est le premier exemple référencé qui pourrait être encombré par un autre module plus bas dans le tuyau.

0
ben.hamelin

Je préfère utiliser le module Node View Permissions . C'est plus simple que le module d'accès au contenu.

Comme dans D6, il ajoute les autorisations "Afficher tout contenu" et "Afficher son propre contenu" à tout type de contenu que vous choisissez.

enter image description here

Étapes à suivre:

  1. Après l'installation et l'activation, accédez à /admin/config/content/node-view-permissions et sélectionnez les types de contenu auxquels vous souhaitez limiter l'accès.
  2. Ensuite aller à /admin/people/permissions#module-node_view_permissions et sélectionnez les rôles dont vous souhaitez pouvoir afficher le contenu. Enregistrez les autorisations.

    Terminé!

0
Chris Happy

J'ai utilisé un extrait de code trouvé dans la documentation de l'API D7 pour le hook_node_access hook .

Ce code accordera l'accès pour afficher le contenu "ebook" aux utilisateurs qui ont l'autorisation "voir ebook".

Vous avez besoin d'une nouvelle autorisation pour contrôler l'accès en implémentant hook_permission ().

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

En implémentant hook_node_access () Drupal peut accorder ou refuser l'accès au nœud.

/**
 * 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;
}

D'autres autorisations (modifier, supprimer, etc.) peuvent être traitées via les autorisations normales Drupal.

Vous pouvez éventuellement supprimer le contenu de la vue d'ensemble de l'administrateur en implémentant 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