Submitted by jayjay1977 on
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
Dans Drupal comme ailleurs
Permalien Soumis par Damien Tournoud le 29 Août, 2007 - 14:32
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 :
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
Permalien Soumis par jayjay1977 le 30 Août, 2007 - 10:26
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)
)
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
Peux-tu regarder tout ce
Permalien Soumis par Damien Tournoud le 30 Août, 2007 - 11:26
Peux-tu regarder tout ce qu'il y a dans la table node_access pour la différents états d'un noeud donné?
Voici ce que j'ai pour les
Permalien Soumis par jayjay1977 le 30 Août, 2007 - 11:50
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+
Ca me semble parfait, à
Permalien Soumis par Damien Tournoud le 30 Août, 2007 - 12:27
Ca me semble parfait, à condition que ton utilisateur soit bien uid=8.
Il y a donc une intéraction avec na_arbitrator que je ne comprends pas bien (voir fonction workflow_access_node_access_grants).
Au temps pour moi, je ne
Permalien Soumis par Damien Tournoud le 30 Août, 2007 - 12:35
Au temps pour moi, je ne regardais pas la bonne version de Workflow.
Hum... Je ne vois pas bien pourquoi cela ne marcherait pas.
Une dernière idée : tu
Permalien Soumis par Damien Tournoud le 30 Août, 2007 - 12:41
Une dernière idée : tu pourrais essayer d'outiller la fonction node_access pour lui faire afficher la requête qui est executée. Cela permettra également de valider qu'aucun autre module n'interfère.
Ok je vais faire des
Permalien Soumis par jayjay1977 le 30 Août, 2007 - 14:51
Ok je vais faire des "traces" de la fonction node_access. Je te donnerai le compte rendu;-).
a+ tard
Jérôme
La requete a tester est
Permalien Soumis par jayjay1977 le 30 Août, 2007 - 17:11
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
Oui, c'est celle-ci. Tu peux
Permalien Soumis par Damien Tournoud le 30 Août, 2007 - 17:53
Oui, c'est celle-ci.
Tu peux tracer la variable $sql, c'est peut être plus simple (et cela t'affichera le nid aussi, en bonus).
ACTIONS REALISEES PAR UN
Permalien Soumis par jayjay1977 le 31 Août, 2007 - 10:47
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
Permalien Soumis par jayjay1977 le 31 Août, 2007 - 10:50
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
Permalien Soumis par Damien Tournoud le 31 Août, 2007 - 10:50
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 :
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é
Permalien Soumis par jayjay1977 le 31 Août, 2007 - 11:48
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
Permalien Soumis par jayjay1977 le 31 Août, 2007 - 15:32
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
Permalien Soumis par Damien Tournoud le 31 Août, 2007 - 16:16
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.
Au fait, si après
Permalien Soumis par Damien Tournoud le 31 Août, 2007 - 16:17
Au fait, si après réflexion, il s'agit bien d'un bug, il faut le faire remonter sur d.o.
Je crois que le week end m'a
Permalien Soumis par jayjay1977 le 3 Septembre, 2007 - 15:08
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
uid=8, oui c'est
Permalien Soumis par jayjay1977 le 30 Août, 2007 - 14:50
uid=8, oui c'est l'utilisateur qui des droits de redaction.