Limitare quali ruoli possono visualizzare un nodo in base al tipo di contenuto


18

Sto usando Drupal 7 e ho creato un nuovo tipo di contenuto chiamato "eBook" e ho creato un nuovo ruolo chiamato "MonthlySubscriber". La mia intenzione è di consentire solo agli utenti con "MonthlySubscriber" di visualizzare i nodi "eBook". Quando ho esaminato le impostazioni di autorizzazione per un ruolo, ho visto le caselle di controllo che consentono di creare, modificare ed eliminare nodi di quel tipo di contenuto, ma non sono presenti caselle di controllo per la visualizzazione dei nodi.

Come posso limitare gli utenti che possono visualizzare i nodi "eBook" solo agli utenti con il ruolo "MonthlySubscriber"?

Risposte:


13

È necessario installare il modulo di accesso al contenuto per aggiungere questo controllo di accesso.

Questo modulo consente di gestire le autorizzazioni per i tipi di contenuto per ruolo e autore. Ti consente di specificare la visualizzazione personalizzata, modificare ed eliminare le autorizzazioni per ciascun tipo di contenuto.


5

Per drupal 7, prova a utilizzare 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
Si prega di evitare risposte di solo codice. Non servono a fini di apprendimento. Almeno spiegare in una frase o tre come esattamente questo particolare codice è una risposta? Come funziona? perché funziona? Il tipo di descrizione che aiuterà gli altri a scrivere codice simile in situazioni simili, invece di chiedere ancora e ancora.
Mołot,

Questa dovrebbe essere la risposta corretta.
GrafiCode

5

Ecco un modo semplice per proteggere le pagine del nodo (nodo / NID) da utenti non privilegiati.

/**
 * 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
Si noti che l'utilizzo hook_node_accessnon funzionerà con qualsiasi cosa che "elenchi" nodi, come una vista. Quindi è possibile limitare l'accesso alla vista in hook_node_access, ma una query Visualizza o nodo personalizzato può comunque mostrare quel nodo all'utente. hook_node_accessè più utile per il controllo editoriale, per il controllo delle operazioni di creazione / aggiornamento / eliminazione
Brian

Il tuo codice non funziona per me, ma mi hai indicato la giusta direzione. Ho trovato il codice funzionante nella documentazione hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo,

Questo è un cattivo esempio perché usa mymodule_node_access come funzione personalizzata mentre Drupal fornisce un hook hook_node_access. Questo può diventare confuso.
Batigolix,

@batigolix, come indicato nella risposta, è un modo per proteggere le pagine dei nodi e non i nodi.
ya.teck


1

Per drupal 7, prova questo: Access by Term

Fornisce un controllo di accesso al nodo molto flessibile e gerarchico (controllo dell'accesso al contenuto), per D7.


0

La soluzione hook_menu_alter pubblicata sopra da ya.teck funziona, ma è in conflitto con lo hook_node_access standard nel nome della sua funzione. il hook_menu_alter non è richiesto in questo caso, quindi la risposta postata da Denis sopra è secondo me più accurata e corretta. Alterando il menu_item come fatto, il primo esempio di riferimento potrebbe essere bloccato da un altro modulo più in basso nella pipe.


0

Ho usato uno snippet di codice trovato nella documentazione di API D7 per l' hook hook_node_access .

Questo codice consentirà l'accesso per visualizzare il contenuto "ebook" agli utenti che dispongono dell'autorizzazione "Visualizza ebook".

È necessaria una nuova autorizzazione per controllare l'accesso implementando hook_permission ().

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

Implementando hook_node_access () Drupal può concedere o negare l'accesso 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;
}

Altre autorizzazioni (modifica, eliminazione, ecc.) Possono essere gestite tramite le normali autorizzazioni Drupal.

Facoltativamente, puoi rimuovere il contenuto dalla panoramica dell'amministratore 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', '!=');
  }
}

0

Mi informo utilizzando le autorizzazioni di visualizzazione nodo modulo . È più semplice del modulo Accesso contenuto.

Come in D6, aggiunge le autorizzazioni "Visualizza qualsiasi contenuto" e "Visualizza il proprio contenuto" a qualsiasi tipo di contenuto scelto.

inserisci qui la descrizione dell'immagine

Passaggi da seguire:

  1. Dopo l'installazione e l'abilitazione, vai /admin/config/content/node-view-permissionse seleziona a quali tipi di contenuti vuoi limitare l'accesso.
  2. Quindi, vai a /admin/people/permissions#module-node_view_permissions e seleziona i ruoli in cui desideri poter visualizzare il contenuto. Salva le autorizzazioni.

    Fatto!


per drupal 8 "Node View Permissions" non funziona
Karthikeyan Manivasagam

@KarthikeyanManivasagam In che modo?
Chris Happy l'

Abbiamo utilizzato questo modulo in uno dei nostri progetti in cui dobbiamo fornire l'accesso alla visualizzazione dei contenuti in base al ruolo e al tipo di contenuto, ma non funziona affatto. si comporta come se non usasse questo modulo.
Karthikeyan Manivasagam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.