Quel est le sens du mot realm ?

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
j'explore un peu le code de drupal et son api. Je ne comprend pas le sens du mot realm dans le contexte drupal?
Par exemple :
Pour la fonction node_access_write_grants / API Node access rights

If a realm is provided, it will only delete grants from that realm ...

Si quelqu'un peut m'éclairer.

Merci

Jérôme

Version de Drupal : 

Dans Drupal comme ailleurs (cf. Kerberos, ...), il s'agit du "contexte". Pour Drupal, il s'agit en fait du nom du module d'accès qui a attribué un droit.

La fonction node_access() est implémentée de la manière suivante :

<?php
function node_access($op, $node = NULL) {
  global
$user;

[...]

  if (
$op != 'create' && $node->nid && $node->status) {
   
$grants = array();
    foreach (
node_access_grants($op) 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));
  }

[...]

}
?>

Ce qui construit une requête de la forme (nid = 0 OR nid = <nid> AND (gid = <premier groupe de l'utilisateur> AND realm = '<premier realm>' OR gid = <second groupe de l'utilisateur> AND realm = '<second realm>') AND grant_<operation> >= 1. Donc l'utilisateur a accès à un node dès qu'un des modules de contrôle d'accès lui en donne le droit.

Pour plus d'informations, tu peux te reporter à l'exemple node_access_example.module

Merci pour ta réponse, ça a plus de sens maintenant. Du coup la gestion des noeuds se fait soit par workflow_acces soit par tac_lite en ce qui me concerne (c'est ce que je vois dans la table node_access).
Il y a aussi workflow_acces_owner.

Donc, pour en revenir à mon "histoire" de workflow. Je me demande si je dois développer un module comme node_access_example.module
pour réaliser ce que je souhaite ou si je dois continuer à voir si mon paramètrage est bon ou si ce que je veux faire est réalisable?

Si tu as des infos pour m'éclairer encore plus?

Explication ci-dessous.

Modules installés
- Workflow + Workflow access
- cck
- Taxonomy access control lite

POur chaque rubrique de mon intranet j'ai créé :
- Un type de contenu cck (cck_nom_rubrique)
- 2 roles : redacteur (cré des brouillons et propose ses articles -> droits create cck_nom_rubrique)
redacteur en chef (publie les articles qui lui sont proposés -> droits create cck_nom_rubrique /edit cck_nom_rubrique)
)

  • 1 workflow composé de 5 états (brouillon/proposé/publié/archivé/corbeille)
    Brouillon : seulement l'auteur doit voir/editer/supprimer et passer l'article à l'état proposé.
    Proposé : l'auteur peut uniquement voir l'article
    le redacteur en chef de la rubrique peut voir/editer/supprimer et publier l'article
    Publié : les utilisateurs authentifiés voient l'article
    seul le rédacteur en chef peut voir/editer/supprimer et changer l'état.

J'ai paramètré tout ça, le workflow fonctionne bien, par contre les accès aux noeuds ne se font pas correctement.
Par exemple lorsqu'un auteur passe son article de l'état (création) --> brouillon il ne peut plus l'éditer!!! il peut le voir et le passer à l'état proposé. (alors que j'ai coché view/edit/delete pour l'état brouillon pour l'auteur)
Par contre le rédacteur en chef peut éditer un article en mode brouillon dont il n'est pas l'auteur!!!

Et merci damz de ta collaboration

Jérôme

Voici ce que j'ai pour les différents état

Pour un noeud à l'état brouillon
nid gid realm view update delete
45 8 workflow_access_owner 1 1 1
45 24 tac_lite 1 0 0

Pour un noeud à l'état proposé
44 24 tac_lite 1 0 0
44 20 workflow_access 0 1 1
44 8 workflow_access_owner 1 0 0

Pour un noeud publié
44 24 tac_lite 1 0 0
44 20 workflow_access 0 1 1
44 2 workflow_access 1 0 0

Merci

A+

La requete a tester est celle ci?

node.module
function node_access
....

if ($op != 'create' && $node->nid && $node->status) {
$grants = array();
foreach (node_access_grants($op) as $realm => $gids) {
foreach ($gids as $gid) {
$grants[] = "(gid = $gid AND realm = '$realm')";
}
}

$grants_sql = '';
if (count($grants)) {
$grants_sql = 'AND ('. implode(' OR ', $grants) .')';
}
trace("\ngrants : " .$grants); // ecrit dans un fichier

...

je t'envoie mes fichiers dès que j'ai terminé.

a+

Jérôme

ACTIONS REALISEES PAR UN REDACTEUR

Voici la trace de node_acces pour un rédacteur.
Les numéros correspondent aux actions, en dessous du num + actions il y a l'évolution de l'écriture de mon fichier de trace.

Si tu prèfères je t'enverai la suite par mail.
Par contre la requète $sql n'est jamais affichée!!

Merci, a+

Jérôme

1 - Clique sur créer un contenu
Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

2 - Contenu Info groupe

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create // un en plus

3 - Saisie / soumettre - etat création - retour sur page view

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status :

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

4 - clic sur workflow (node à l'état brouillon - mon rédacteur ne peut pas editer son article - il peut uniquement le voir
et accéder au workflow)

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status :

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete

node->nid : 50 | node->status : 0

Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

5 - soummission du workflow - changement d'état - brouillon à proposé

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status :

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

Operation op : view
node->nid : 50 | node->status : 0

Dans Let authors view their own nodes.
user->uid : 2 | node->uid : 2
Operation op : update
node->nid : 50 | node->status : 0

Operation op : delete
node->nid : 50 | node->status : 0

/* l'article est proposé au redacteur en chef */

/*************************************************
/* LES TRACES DANS NODE ACCESS */
/*************************************************

function trace($texte){
$logfile="/home/drupal.ledl.priv/www/files/node_access.txt";
$inF = fopen($logfile,"a+");
fputs($inF,$texte);
fclose($inF);
}

function node_access($op, $node = NULL) {
global $user;

trace("\nOperation op : ".$op."\n");

// Convert the node to an object if necessary:
if ($op != 'create') {
$node = (object)$node;
}

// If the node is in a restricted format, disallow editing.
if ($op == 'update' && !filter_access($node->format)) {
return FALSE;
}

if (user_access('administer nodes')) {
return TRUE;
}

if (!user_access('access content')) {
return FALSE;
}

// Can't use node_invoke(), because the access hook takes the $op parameter
// before the $node parameter.
$module = node_get_types('module', $node);
if ($module == 'node') {
$module = 'node_content'; // Avoid function name collisions.
}
$access = module_invoke($module, 'access', $op, $node);
if (!is_null($access)) {
return $access;
}
trace("node->nid : ".$node->nid." | node->status : ".$node->status."\n");
// If the module did not override the access rights, use those set in the
// node_access table.
if ($op != 'create' && $node->nid && $node->status) {
$grants = array();
foreach (node_access_grants($op) as $realm => $gids) {
foreach ($gids as $gid) {
$grants[] = "(gid = $gid AND realm = '$realm')";
}
}

$grants_sql = '';
if (count($grants)) {
$grants_sql = 'AND ('. implode(' OR ', $grants) .')';
}
trace("\ngrants : " .$grants);

trace("\ngrants_sql : ".$grants_sql);

$sql = "SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) $grants_sql AND grant_$op >= 1";

trace("\nREQUETE SELECT " .$sql);

$result = db_query($sql, $node->nid);

return (db_result($result));

}

// Let authors view their own nodes.
if ($op == 'view' && $user->uid == $node->uid && $user->uid != 0) {
trace("\nDans Let authors view their own nodes.\n\tuser->uid : ".$user->uid ." | node->uid : ". $node->uid);
return TRUE;
}

return FALSE;
}

ACTIONS REALISEES PAR UN REDACTEUR EN CHEF

Cette fois les requetes $sql et $grant_sql s'affiche.

1 - view via l'url - http://drupal.ledl.priv/?q=node/50/ --> Accès refusé !!!
Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

2 - clic sur edit - http://drupal.ledl.priv/?q=node/50/edit

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : delete

3 - clic sur workflow - http://drupal.ledl.priv/?q=node/50/workflow

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

4 - changement état proposé --> publié
Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : create

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 0

Operation op : update

Operation op : delete

Operation op : view
node->nid : 50 | node->status : 1

grants : Array

grants_sql : AND ((gid = 0 AND realm = 'all') OR (gid = 2 AND realm = 'workflow_access') OR (gid = 38 AND realm = 'workflow_access') OR (gid =
3 AND realm = 'workflow_access_owner') OR (gid = 36 AND realm = 'tac_lite') OR (gid = 37 AND realm = 'tac_lite') OR (gid = 38 AND realm = 'ta
c_lite') OR (gid = 1 AND realm = 'tac_lite') OR (gid = 3 AND realm = 'tac_lite') OR (gid = 2 AND realm = 'tac_lite') OR (gid = 4 AND realm = '
tac_lite') OR (gid = 49 AND realm = 'tac_lite') OR (gid = 39 AND realm = 'tac_lite') OR (gid = 40 AND realm = 'tac_lite') OR (gid = 41 AND rea
lm = 'tac_lite') OR (gid = 42 AND realm = 'tac_lite') OR (gid = 44 AND realm = 'tac_lite') OR (gid = 45 AND realm = 'tac_lite') OR (gid = 46 A
ND realm = 'tac_lite') OR (gid = 47 AND realm = 'tac_lite') OR (gid = 48 AND realm = 'tac_lite') OR (gid = 5 AND realm = 'tac_lite') OR (gid =
6 AND realm = 'tac_lite') OR (gid = 51 AND realm = 'tac_lite') OR (gid = 53 AND realm = 'tac_lite') OR (gid = 7 AND realm = 'tac_lite') OR (g
id = 8 AND realm = 'tac_lite') OR (gid = 9 AND realm = 'tac_lite') OR (gid = 50 AND realm = 'tac_lite') OR (gid = 10 AND realm = 'tac_lite') O
R (gid = 0 AND realm = 'tac_lite') OR (gid = 11 AND realm = 'tac_lite') OR (gid = 12 AND realm = 'tac_lite') OR (gid = 17 AND realm = 'tac_lit
e') OR (gid = 18 AND realm = 'tac_lite') OR (gid = 19 AND realm = 'tac_lite') OR (gid = 20 AND realm = 'tac_lite') OR (gid = 21 AND realm = 't
ac_lite') OR (gid = 22 AND realm = 'tac_lite') OR (gid = 23 AND realm = 'tac_lite') OR (gid = 24 AND realm = 'tac_lite') OR (gid = 25 AND real
m = 'tac_lite') OR (gid = 26 AND realm = 'tac_lite') OR (gid = 28 AND realm = 'tac_lite') OR (gid = 29 AND realm = 'tac_lite') OR (gid = 30 AN
D realm = 'tac_lite') OR (gid = 31 AND realm = 'tac_lite') OR (gid = 32 AND realm = 'tac_lite') OR (gid = 0 AND realm = 'tac_lite'))

REQUETE SELECT $sql SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) AND ((gid = 0 AND realm = 'all') OR (gid = 2 AND realm = 'workfl
ow_access') OR (gid = 38 AND realm = 'workflow_access') OR (gid = 3 AND realm = 'workflow_access_owner') OR (gid = 36 AND realm = 'tac_lite')
OR (gid = 37 AND realm = 'tac_lite') OR (gid = 38 AND realm = 'tac_lite') OR (gid = 1 AND realm = 'tac_lite') OR (gid = 3 AND realm = 'tac_lit
e') OR (gid = 2 AND realm = 'tac_lite') OR (gid = 4 AND realm = 'tac_lite') OR (gid = 49 AND realm = 'tac_lite') OR (gid = 39 AND realm = 'tac
_lite') OR (gid = 40 AND realm = 'tac_lite') OR (gid = 41 AND realm = 'tac_lite') OR (gid = 42 AND realm = 'tac_lite') OR (gid = 44 AND realm
= 'tac_lite') OR (gid = 45 AND realm = 'tac_lite') OR (gid = 46 AND realm = 'tac_lite') OR (gid = 47 AND realm = 'tac_lite') OR (gid = 48 AND
realm = 'tac_lite') OR (gid = 5 AND realm = 'tac_lite') OR (gid = 6 AND realm = 'tac_lite') OR (gid = 51 AND realm = 'tac_lite') OR (gid = 53
AND realm = 'tac_lite') OR (gid = 7 AND realm = 'tac_lite') OR (gid = 8 AND realm = 'tac_lite') OR (gid = 9 AND realm = 'tac_lite') OR (gid =
50 AND realm = 'tac_lite') OR (gid = 10 AND realm = 'tac_lite') OR (gid = 0 AND realm = 'tac_lite') OR (gid = 11 AND realm = 'tac_lite') OR (g
id = 12 AND realm = 'tac_lite') OR (gid = 17 AND realm = 'tac_lite') OR (gid = 18 AND realm = 'tac_lite') OR (gid = 19 AND realm = 'tac_lite')
OR (gid = 20 AND realm = 'tac_lite') OR (gid = 21 AND realm = 'tac_lite') OR (gid = 22 AND realm = 'tac_lite') OR (gid = 23 AND realm = 'tac_
lite') OR (gid = 24 AND realm = 'tac_lite') OR (gid = 25 AND realm = 'tac_lite') OR (gid = 26 AND realm = 'tac_lite') OR (gid = 28 AND realm =
'tac_lite') OR (gid = 29 AND realm = 'tac_lite') OR (gid = 30 AND realm = 'tac_lite') OR (gid = 31 AND realm = 'tac_lite') OR (gid = 32 AND r
ealm = 'tac_lite') OR (gid = 0 AND realm = 'tac_lite')) AND grant_view >= 1
Operation op : update

Operation op : delete

/* Après cette action le redacteur chef peut voir/editer/supprimer */

Hum ok, je comprends mieux.

Dans node_access(), la requête vers la table node_access n'est executée que si le test suivant est vrai :

<?php
if ($op != 'create' && $node->nid && $node->status) {
]
?>

Donc seulement pour les noeuds publiés ($node->status != 0) !

Essaye donc de passer les noeuds en publiés pour voir si ca peut résoudre ton problème. A ce moment là, tu pourras changer ton workflow pour mettre en état publié par défaut, mais interdire (avec workflow_access), la lecture du noeud tant qu'il n'a pas été validé par le rédacteur en chef.

Et bien écoute, j'ai passé les noeuds à "publié" par défaut et ... ca marche.
Bon je vais faire d'autres tests afin de valider le tout à 100% avant de sauter de joie!

En tout cas merci pour ton aide, je te recontacte si besoin.
Si ça fonctionne bien je ferai un petit topo sur ma réalisation.

Grand merci à toi

Jérôme

Joie de courte durée!

Si je mets publié par défaut, meme à l'etat brouillon les simples utilisateurs authentifiés peuvent voir l'article.
Comme fais tu pour interdire avec workflow_access, la lecture du noeud tant qu'il n'a pas été validé par le rédacteur en chef.?
Faut-il que j'utilise le module action?

J'espère que je vais en voir la fin!

A+

Jérôme

Je serais toi, je supprimerais le test sur $node->status dans node.module. J'ai vérifié dans le CVS, ce test est présent depuis 2004, au moment où a été implémenté le contrôle d'accès. Je considère qu'il s'agit d'un bug, mais je n'ai pas non plus totalement creusé le sujet.

Je crois que le week end m'a permis de faire une bonne pause.

Donc après réflexion, pour que mon besoin fonctionne il faut que :
- pour un type de contenu, la case à coché par workflow / options par défaut / publié doit coché,
- $node->status ne doit pas être un bug, par contre dans le cas ou l'option cité au-dessus est cochée, il ne faut pas retirer le test $node -> $status. Car le noeud sera publié, et workflow acces ne sera pas pris en compte
- finalement ce qui posait problème c'est la compatibilité entre les modules taxonomy access control lite et workflow access, alors j'ai désinstallé TAC LITE.

En tout cas ca m'a bien aidé de faire des "traces" du code pour comprendre. Merci pour ton expertise.
Surement à très bientôt. Un nouveau site durpal va peut etre sortir de la boite à projet.

Jérôme