Limite qué roles pueden ver un nodo basándose en su tipo de contenido

18

Estoy usando Drupal 7 y creé un nuevo tipo de contenido llamado "eBook", y creé una nueva función llamada "MonthlySubscriber". Mi intención es permitir que solo los usuarios con el "Suscriptor mensual" vean los nodos "eBook". Cuando miré la configuración de permisos para un rol, vi las casillas de verificación que permiten crear, editar y eliminar nodos de ese tipo de contenido, pero no hay casillas de verificación para ver los nodos.

¿Cómo limito los usuarios que pueden ver los nodos "eBook" solo a los usuarios con el rol "MonthlySubscriber"?

John
fuente

Respuestas:

13

Debe instalar el módulo de acceso al contenido para agregar este control de acceso.

Este módulo le permite administrar permisos para tipos de contenido por rol y autor. Le permite especificar vistas personalizadas, editar y eliminar permisos para cada tipo de contenido.

iStryker
fuente
5

Para drupal 7, intente usar 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
fuente
1
Evite las respuestas de solo código. No tienen ningún propósito de aprendizaje. Al menos explique en una oración o tres cómo exactamente este código en particular es una respuesta. ¿Como funciona? por que funciona El tipo de descripción que ayudará a otros a escribir código similar en una situación similar, en lugar de preguntar una y otra vez.
Mołot
Esta debería ser la respuesta correcta.
GrafiCode
5

Aquí hay una manera simple de proteger las páginas de nodo (nodo / NID) de usuarios sin privilegios.

/**
 * 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
fuente
2
Tenga en cuenta que el uso hook_node_accessno funcionará con nada que "enumere" nodos, como una Vista. Por lo tanto, puede restringir el acceso a la vista hook_node_access, pero una vista o una consulta de nodo personalizada aún puede mostrar ese nodo al usuario. hook_node_accesses más útil para el control editorial, para controlar las operaciones de creación / actualización / eliminación
Brian
Su código no funciona para mí, pero me señaló en la dirección correcta. Encontré código de trabajo en la documentación de hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo
Este es un mal ejemplo porque usa mymodule_node_access como función personalizada, mientras que Drupal proporciona un hook hook_node_access. Esto puede volverse confuso.
batigolix 01 de
@batigolix, como se indica en la respuesta, es una forma de proteger las páginas de nodo, no los nodos.
ya.teck
1

Para drupal 7, pruebe este: Acceso por plazo

Proporciona control de acceso de nodo jerárquico muy flexible (control de acceso de contenido), para D7.

washooo
fuente
0

La solución hook_menu_alter publicada anteriormente por ya.teck funciona, pero entra en conflicto con el estándar hook_node_access en su nombre de función. el hook_menu_alter no es necesario en este caso, por lo que la respuesta publicada por Denis arriba es, en mi opinión, más precisa y la forma correcta. La alteración de menu_item como se hace es el primer ejemplo referenciado que podría ser golpeado por otro módulo más adelante.

ben.hamelin
fuente
0

Utilicé un fragmento de código que se encuentra en la documentación de la API D7 para el enlace hook_node_access .

Este código otorgará acceso para ver el contenido del "libro electrónico" a los usuarios que tengan el permiso "ver libro electrónico".

Necesita un nuevo permiso para controlar el acceso mediante la implementación de hook_permission ().

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

Al implementar hook_node_access (), Drupal puede otorgar o denegar el acceso al nodo.

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

Otros permisos (editar, eliminar, etc.) pueden tratarse a través de los permisos normales de Drupal.

Opcionalmente, puede eliminar el contenido de la descripción general del administrador implementando 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
fuente
0

Prefiero usar el módulo de permisos de vista de nodo . Es más simple que el módulo de acceso al contenido.

Al igual que en D6, agrega los permisos "Ver cualquier contenido" y "Ver contenido propio" a cualquier tipo de contenido que elija.

ingrese la descripción de la imagen aquí

Pasos a seguir:

  1. Después de instalar y habilitar, vaya /admin/config/content/node-view-permissionsy seleccione a qué tipos de contenido desea limitar el acceso.
  2. Luego, vaya /admin/people/permissions#module-node_view_permissions y seleccione los roles en los que desea poder ver el contenido. Guardar permisos.

    ¡Hecho!

Chris feliz
fuente
para drupal 8 "Permisos de vista de nodo" no funciona
Karthikeyan Manivasagam
@KarthikeyanManivasagam ¿Cómo es eso?
Chris Happy
Utilizamos este módulo en uno de nuestros proyectos donde necesitamos proporcionar acceso a la vista de contenido en función del rol y el tipo de contenido, pero no funciona en absoluto. se comporta igual sin usar este módulo.
Karthikeyan Manivasagam