Drupalin käyttäjäroolit ja oikeuksien hallinta
Assemblix wiki
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.
- function node_access($op, $node, $account = NULL) {
- global $user;
- if (!$node) {
- return FALSE;
- }
- // Convert the node to an object if necessary:
- if ($op != 'create') {
- $node = (object)$node;
- }
- // If no user object is supplied, the access check is for the current user.
- if (empty($account)) {
- $account = $user;
- }
- // Kielletään muokkaus, jos solmun format-tyyppi ei ole käyttäjälle sallittu:
- if ($op == 'update' && !filter_access($node->format)) {
- return FALSE;
- }
- if (user_access('administer nodes', $account)) {
- return TRUE; // Sallitaan muokkaus, jos käyttäjällä on rooli "administer nodes"
- }
- if (!user_access('access content', $account)) {
- return FALSE; // Kielletään muokkaus, jos käyttäjä ei saa edes katsella sisältöä
- }
- // Selvitetään, mikä moduuli on vastuussa tämän solmun sisältötyypin
- // käsittelystä.
- $module = node_get_types('module', $node);
- if ($module == 'node') {
- $module = 'node_content'; // Jos kyse on geneerisestä nodesta (= tämä), nimetään node_content
- }
- $access = module_invoke($module, 'access', $op, $node, $account); // Kutsutaan moduulikohtaista access-funktiota
- if (!is_null($access)) {
- return $access; // Tietotyypin toteuttava moduuli teki päätöksen, palataan sen arvolla
- }
- // Koska mikään moduuli ei antanut päätöstä (kieltoa tai sallimista),
- // tutkitaan onko node_access-tauluun määritetty noodikohtaisia sääntöjä:
- if ($op != 'create' && $node->nid && $node->status) {
- $grants = array();
- foreach (node_access_grants($op, $account) as $realm => $gids) {
- foreach ($gids as $gid) {
- $grants[] = "(gid = $gid AND realm = '$realm')";
- }
- }
- $grants_sql = '';
- if (count($grants)) {
- $grants_sql = 'AND ('. implode(' OR ', $grants) .')';
- }
- $sql = "SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) $grants_sql AND grant_$op >= 1";
- $result = db_query($sql, $node->nid);
- return (db_result($result));
- }
- // Sisällön luonut käyttäjä (ja ylläpitäjä) voivat oletuksena aina katsella noodia
- if ($op == 'view' && $account->uid == $node->uid && $account->uid != 0) {
- return TRUE;
- }
- return FALSE; // Jos mikään tarkistuksista ei palauttanut TRUE, ei pääsyä sallita.
- }
(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

