Drupalin käyttäjäroolit ja oikeuksien hallinta

Assemblix wiki

Loikkaa: valikkoon, hakuun
Tämä artikkeli tai osio on tynkä. Voit auttaa Drupal-wikiä laajentamalla sitä.

Sisällysluettelo

[muokkaa] Yleistä

[muokkaa] Käyttäjätunnukset

[muokkaa] Käyttäjäroolit

[muokkaa] Operaatiot

[muokkaa] Roolien soveltaminen käytännössä

[muokkaa] Sisäänrakennetut roolit

[muokkaa] Moduulin roolit

[muokkaa] Sisältötyypin roolit

[muokkaa] Ongelmanselvittely

Ongelma: Sisällön muokkaus ei ole sallittu, vaikka käyttäjätunnukselle on kytketty kaikki node-moduulin roolit.

  • Solmun suodatin (filter) saattaa edellyttää lisäoikeuksia. Jos esimerkiksi palvelun pääkäyttäjä on luonut sivun ja asettanut sisällön suodattimeksi "Rajoittamaton HTML", ei normaalioikeuksilla varustettu käyttäjä pääse muokkaamaan solmua vaikka sen tekijäksi muutettaisiin käyttäjä itse ja aktivoitaisiin kaikki sisällönmuokkauksen edellyttämät roolit.
  • Käy läpi node_access(), etsi sääntöjä jotka palauttavat FALSE muokkaukseen liittyvissä operaatioissa:

Lähdekoodiote: node_access, node.module, v 1.894 Drupal 6 beta 2, rivit 1779-1843.

  1. function node_access($op, $node, $account = NULL) {
  2.   global $user;
  3.  
  4.   if (!$node) {
  5.     return FALSE;
  6.   }
  7.   // Convert the node to an object if necessary:
  8.   if ($op != 'create') {
  9.     $node = (object)$node;
  10.   }
  11.   // If no user object is supplied, the access check is for the current user.
  12.   if (empty($account)) {
  13.     $account = $user;
  14.   }
  15.   // Kielletään muokkaus, jos solmun format-tyyppi ei ole käyttäjälle sallittu:
  16.   if ($op == 'update' && !filter_access($node->format)) {
  17.     return FALSE;
  18.   }
  19.  
  20.   if (user_access('administer nodes', $account)) {
  21.     return TRUE;      // Sallitaan muokkaus, jos käyttäjällä on rooli "administer nodes"
  22.   }
  23.  
  24.   if (!user_access('access content', $account)) {
  25.     return FALSE;    // Kielletään muokkaus, jos käyttäjä ei saa edes katsella sisältöä
  26.   }
  27.  
  28.   // Selvitetään, mikä moduuli on vastuussa tämän solmun sisältötyypin
  29.   // käsittelystä.
  30.   $module = node_get_types('module', $node);
  31.   if ($module == 'node') {
  32.     $module = 'node_content'; // Jos kyse on geneerisestä nodesta (= tämä), nimetään node_content
  33.   }
  34.   $access = module_invoke($module, 'access', $op, $node, $account);  // Kutsutaan moduulikohtaista access-funktiota
  35.   if (!is_null($access)) {
  36.     return $access;  // Tietotyypin toteuttava moduuli teki päätöksen, palataan sen arvolla
  37.   }
  38.  
  39.   // Koska mikään moduuli ei antanut päätöstä (kieltoa tai sallimista),
  40.   // tutkitaan onko node_access-tauluun määritetty noodikohtaisia sääntöjä:
  41.   if ($op != 'create' && $node->nid && $node->status) {
  42.     $grants = array();
  43.     foreach (node_access_grants($op, $account) as $realm => $gids) {
  44.       foreach ($gids as $gid) {
  45.         $grants[] = "(gid = $gid AND realm = '$realm')";
  46.       }
  47.     }
  48.  
  49.     $grants_sql = '';
  50.     if (count($grants)) {
  51.       $grants_sql = 'AND ('. implode(' OR ', $grants) .')';
  52.     }
  53.  
  54.     $sql = "SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) $grants_sql AND grant_$op >= 1";
  55.     $result = db_query($sql, $node->nid);
  56.     return (db_result($result));
  57.   }
  58.  
  59.   // Sisällön luonut käyttäjä (ja ylläpitäjä) voivat oletuksena aina katsella noodia
  60.   if ($op == 'view' && $account->uid == $node->uid && $account->uid != 0) {
  61.     return TRUE;
  62.   }
  63.  
  64.   return FALSE;  // Jos mikään tarkistuksista ei palauttanut TRUE, ei pääsyä sallita.
  65. }

(Muutamia lähdekoodirivejä suomennettu ja selvennetty. Alkuperäinen versio löytyy sivustolta drupal.org. Kummankin version lisenssi: GPL 2.0.)

Katso myös: http://drupal.org/Troubleshooting-FAQ

Henkilökohtaiset työkalut