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

18

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 d'autoriser uniquement les utilisateurs avec le "MonthlySubscriber" à voir les nœuds "eBook". Lorsque j'ai regardé 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"?

John
la source

Réponses:

13

Vous devez installer le module d' accès au contenu 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.

iStryker
la source
5

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;
}
Denis
la source
1
Veuillez éviter les réponses contenant uniquement du code. Ils n'ont aucun but d'apprentissage. Expliquez au moins dans une phrase ou trois comment exactement ce code particulier est une réponse? Comment ça marche? pourquoi ça marche? Le type de description qui aidera les autres à écrire du code similaire dans une situation similaire, au lieu de demander encore et encore.
Mołot
Ce devrait être la bonne réponse.
GrafiCode
5

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);
}
ya.teck
la source
2
Notez que l'utilisation hook_node_accessne fonctionnera pas avec tout ce qui "répertorie" les nœuds, comme une vue. Vous pouvez donc restreindre l'accès à la vue dans hook_node_access, mais une vue ou une requête de nœud personnalisé peut toujours montrer ce nœud à l'utilisateur. hook_node_accessest plus utile pour le contrôle éditorial, pour contrôler les opérations de création / mise à jour / suppression
Brian
Votre code ne fonctionne pas pour moi, mais vous m'avez dirigé dans la bonne direction. J'ai trouvé du code de travail sur la documentation hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo
C'est un mauvais exemple car il utilise mymodule_node_access comme fonction personnalisée tandis que Drupal fournit un hook hook_node_access. Cela peut devenir déroutant.
batigolix
@batigolix, comme indiqué dans la réponse, c'est un moyen de protéger les pages de nœuds et non les nœuds.
ya.teck
1

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

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

Washooo
la source
0

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.

ben.hamelin
la source
0

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

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 (modification, suppression, etc.) peuvent être traitées via les autorisations Drupal normales.

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', '!=');
  }
}
batigolix
la source
0

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.

entrez la description de l'image ici

Étapes à suivre:

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

    Terminé!

Chris Happy
la source
pour drupal 8 "Node View Permissions" ne fonctionne pas
Karthikeyan Manivasagam
@KarthikeyanManivasagam Comment cela?
Chris Happy
Nous avons utilisé ce module dans l'un de nos projets où nous devons fournir un accès à la vue du contenu en fonction du rôle et du type de contenu, mais cela ne fonctionne pas du tout. il se comporte de la même manière sans utiliser ce module.
Karthikeyan Manivasagam du