17.6 Manipulation des comptes utilisateur
Ce chapitre a pour but de montrer, par l'utilisation des méthodes et fonctions les plus courantes, la manipulation des utilisateurs "interne".
Ce chapitre ne décrit pas la manipulation des utilisateurs réseaux disponibles avec le module "dynacase-networkuser".
17.6.1 Création d'un utilisateur
La création d'un utilisateur peut être fait à l'aide de la famille
IUSER
.
Les comptes utilisateurs sont gérés par la classe Account
. La famille IUSER
permet de faire le lien entre le compte "système" (classe Account
) et le
document (famille IUSER
).
Un utilisateur est identifié par un numéro unique. Ce numéro est renseigné par
l'attribut us_whatid
du document IUSER
. Il correspond à l'attribut
"id" de la classe Account
.
Code minimaliste pour créer un utilisateur via les documents.
include_once("FDL/Class.Doc.php"); $iUser=createDoc("",'IUSER'); if ($iUser) { $iUser->setValue("us_login","jean.martin"); $iUser->setValue("us_lname","martin"); $iUser->setValue("us_fname","jean"); $iUser->setValue("us_passwd1","secret"); $iUser->setValue("us_passwd2","secret"); // nécessaire de doubler à cause des contraintes $err=$iUser->store(); if (!$err) { print "nouvel utilisateur n°".$iUser->getValue("us_whatid"); // affichage de l'identifiant système } else { print "\nerreur:$err"; } }
17.6.2 Correspondance entre compte User et document IUSER
Pour récupérer le compte système à partir du document IUSER
:
$user=$userDoc->getAccount(); if ($user->id != $doc->getValue("us_whatid") ) { // ce n'est pas normal }
Si vous ne disposez que de l'identifiant documentaire vous pouvez aussi utiliser la méthode setFid de la classe Account:
$user=new Account(); $user->setFid($docUserId); if ($user->isAffected()) { print $user->login; }
A l'inverse pour récupérer l'objet documentaire à partir du compte système, vous pouvez utiliser l'attribut "fid".
$user=new Account(); $user->setLoginName("john.doe"); if ($user->isAffected()) { $doc=new_doc("", $user->fid); }
Attributs de correspondance : Compte User ⇔ Document IUSER
Compte User | Document IUSER
|
---|---|
id | us_whatid |
login | us_login |
us_mail | |
firstname | us_fname |
lastname | us_lname |
fid | id |
Exemple de création d'utilisateur via la classe Account
$user=new Account(); $user->login='jean.dupond'; $user->firstname='Jean'; $user->lastname='Dupond'; $user->password_new='secret'; $err=$user->add(); if ($err) { error_log($err); } else { print "Nouvel utilisateur n°".$user->id; }
17.6.3 Groupe d'utilisateurs
La famille IGROUP
permet de rajouter des utilisateurs dans des groupes.
La famille IGROUP
comme la famille IUSER
utilise la classe Account
pour
identifier les groupes "système".
Comme la famille IUSER
, la famille IGROUP
dispose de la méthode
IGROUP::getAccount()
pour récupérer l'objet Account
correspondant
17.6.3.1 Correspondance Compte Groupe ⇔ Document IGROUP
Compte Groupe | Document IGROUP
|
---|---|
id | us_whatid |
login | us_login |
lastname | grp_name |
fid | id |
Le compte "Account" d'un groupe a toujours son attribut "accounttype" à "G".
17.6.3.2 Ajout d'un utilisateur à un groupe
Utilisation de Dcp\Family\IGROUP::insertDocument()
.
Ajout de l'utilisateur n°1009 dans le groupe GDEFAULT :
include_once("FDL/Class.Doc.php"); $dbaccess = getDbAccess(); $group = new_Doc($dbaccess,"GDEFAULT"); $user = new_Doc($dbaccess,1009); // 1009 est la référence documentaire de l'utilisateur printf("ajout de l'utilisateur %s [%d] au groupe %s [%d]\n", $user->getTitle(),$user->id,$group->getTitle(),$group->id); printf("liste des groupes avant\n"); print_r($user->getTValue("us_idgroup")); $err=$group->insertDocument($user->initid); print "Error:$err\n"; printf("liste des groupes apres\n"); print_r($user->getTValue("us_idgroup"));
17.6.3.3 Suppression d'utilisateur dans un groupe
Utilisation de Dcp\Family\IGROUP::removeDocument()
.
include_once("FDL/Class.Doc.php"); $dbaccess=getDbAccess(); $group=new_Doc($dbaccess,"GDEFAULT"); $user=new_Doc($dbaccess,1009); printf("suppression de l'utilisateur %s [%d] du groupe %s [%d]\n", $user->getTitle(),$user->id,$group->getTitle(),$group->id); printf("liste des groupes avant\n"); print_r($user->getTValue("us_idgroup")); $err=$group->removeDocument($user->initid); print "Error:$err\n"; printf("liste des groupes apres\n"); print_r($user->getTValue("us_idgroup"));
17.6.3.4 Récupération des membres d'un groupe
À partir de l'objet "Account" d'un groupe : Account::getAllMembers()
.
Exemple d'utilisation :
$docGroup=new_Doc("", "GDEFAULT"); $group=$docGroup->getAccount(); $members=$group->getAllMembers(); $userDocIdList=array(); foreach ($members as $user) { printf("%s) %s\n", $user["id"],$user["login"]); $userDocIdList[]=$user["fid"]; } print "---\n"; // recherche des documents `IUSER` correspondants $documentList=new DocumentList(); $documentList->addDocumentIdentificators($userDocIdList); foreach ($documentList as $docid=>$docIUser) { printf("%s)%s\n", $docIUser->id, $docIUser->getTitle()); }
17.6.4 Rôles
La famille ROLE
permet d'associer des rôles à des utilisateurs ou à des
groupes.
La famille ROLE
comme la famille IUSER
utilise la classe Account
pour
identifier les groupes "système".
Comme la famille IUSER
, la famille ROLE
dispose de la méthode
ROLE::getAccount()
pour récupérer l'objet Account
correspondant
17.6.4.1 Correspondance Compte Rôle ⇔ Document ROLE
Compte Rôle | Document ROLE
|
---|---|
id | us_whatid |
login | role_login |
lastname | role_name |
fid | id |
17.6.5 Récupération des utilisateurs associés à un rôle
Comme pour les groupes, à partir de l'objet "Account" d'un rôle :
Account::getAllMember()
.
Exemple d'utilisation :
$docRole=new_Doc("", "TST_ROLE"); $members=$docRole->getAccount()->getAllMembers(); $userDocIdList=array(); foreach ($members as $user) { printf("%s) %s\n", $user["id"],$user["login"]); $userDocIdList[]=$user["fid"]; } print "---\n"; // recherche des documents `IUSER` correspondants $documentList=new DocumentList(); $documentList->addDocumentIdentificators($userDocIdList); foreach ($documentList as $docid=>$docIUser) { printf("%s)%s\n", $docIUser->id, $docIUser->getTitle()); }
17.6.6 Récupération des rôles d'un utilisateur
À partir de l'objet "Account" , méthode Account::getAllRoles()
Exemple d'utilisation :
$user=new Account(''); $user->setLoginName('john.doe'); if ($user->isAffected()) { $roles=$user->getAllRoles(); foreach ($roles as $aRole) { printf("%d)%s\n", $aRole["id"],$aRole["login"]); } }
17.6.7 Suppléants et titulaires
Affectation d'un suppléant à un utilisateur et récupérations des titulaires.
$user=new Account(); $user->setLoginName("j1"); if ($user->isAffected()) { $err=$user->setSubstitute("j2"); // J1 est le titulaire de J2 //(J2 est suppléant de J1) } $user->setLoginName("j3"); if ($user->isAffected()) { $err=$user->setSubstitute("j2");// J3 est le titulaire de J2 } $user->setLoginName("j2"); $incumbents=$user->getIncumbents(); // J2 a comme titulaire J1 et J3 foreach ($incumbents as $key=> $aIncumbent) { printf("%d)%s\n", $key,Account::getDisplayName($aIncumbent)); }
Résultat :
www-data@luke:~$ ./wsh.php --api=testSubstitute 0)j1 Doe 1)j3 Doe
17.6.8 Recherche de comptes
Il est possible de rechercher les comptes suivant leurs critères d'appartenance
à des rôles ou des groupes. La classe SearchAccount
permet de
réaliser facilement la recherche de compte. Le résultat de cette recherche peut
retourner des utilisateurs, des groupes ou des rôles.
17.6.8.1 Recherche des utilisateurs par rôle
Pour indiquer le filtre d'un rôle, il faut utiliser, la méthode
::addRoleFilter()
. Cette méthode prend en argument la référence du rôle. La
référence correspond à l'attribut 'role_login' du document ou à l'attribut login
de l'objet Account. Il ne correspond pas au nom logique du document.
$searchAccount = new SearchAccount(); $searchAccount->addRoleFilter('writter'); $searchAccount->setObjectReturn($searchAccount::returnAccount); /** * @var \AccountList $accountList */ $accountList = $searchAccount->search(); /** * @var \Account $account */ foreach ($accountList as $account) { $login = $account->login; print "$login\n"; }
Pour rechercher à partir du nom logique du document rôle, il faut utiliser la méthode ::docName2login de correspondance fournie par la classe.
$searchAccount->addRoleFilter($searchAccount->docName2login('TST_ROLEWRITTER'));
La méthode SearchAccount::setObjectReturn()
permet d'indiquer le type de
résultat obtenu par la méthode SearchAccount::search()
. Par défaut cela
retourne un objet AccountList qui est un itérateur sur des objets Account. Il
est possible d'indiquer SearchAccount::returnDocument
, pour que la méthode
SearchAccount::search()
retourne un objet DocumentList
qui
donnera les documents correspondants
$searchAccount = new SearchAccount(); $searchAccount->addRoleFilter($searchAccount->docName2login('TST_ROLEWRITTER')); $searchAccount->setObjectReturn($searchAccount::returnDocument); /** * @var \DocumentList $documentList */ $documentList = $searchAccount->search(); /** * @var \Doc $doc */ foreach ($documentList as $doc) { $login = $doc->getValue("us_login"); print "$login\n"; }
Si on précise plusieurs rôles séparés par un espace, cela indiquera une disjonction (OU).
$searchAccount->addRoleFilter("writter controller");
indique que les comptes recherchés ont le rôle "writter" ou "controller".
Cette écriture est équivalente à :
$searchAccounts->addRoleFilter("writter"); $searchAccount->addRoleFilter("controller");
La condition d'appartenance à plusieurs rôles n'est pas disponible avec cette méthode. Ce filtre peut retourner des groupes ou des utilisateurs.
17.6.8.2 Recherche des utilisateurs par groupe
La méthode ::addGroupFilter()
est équivalent à ::addRoleFilter()
. Elle permet de
rechercher parmi les comptes qui appartiennent à différents groupes. Si cette
méthode est combinée à la méthode ::addRoleFilter()
cela indique tous les
comptes qui appartiennent à un des groupes cités ou à un des rôles cités.
$searchAccounts->addGroupFilter("all"); // tous les utilisateurs du groupe "all"
La recherche par groupe recherche aussi les comptes dans les sous-groupes. Ce filtre peut retourner des groupes ou des utilisateurs.
17.6.8.3 Recherche sur des critères de compte
La méthode ::addFilter() permet d'ajouter des filtres sur les caractéristiques des comptes:
- login
- firstname
- lastname
- accounttype
- status
$mailExpr='test'; $searchAccount = new SearchAccount(); $searchAccount->addFilter("mail ~ '%s'", $mailExpr); // filtre les mail qui contiennent test $accountList = $searchAccount->search(); foreach ($accountList as $account) { printf("%s => %s\n ", $account->login, $account->mail); }
La méthode SearchAccount::addFilter()
ajoute une condition supplémentaire sur
le filtre. Le premier argument est la partie statique du filtre et les suivants
sont les arguments du filtre comme pour sprintf.
Au contraire de SearchAccount::addGroupFilter()
ou
SearchAccount::addRoleFilter()
les filtres sont autant de critères ajoutés à la
condition finale.
La méthode SearchAccount::setTypeReturn()
permet de préciser le type de compte
à retourner : Utilisateur, Groupe ou Rôle.
$searchAccount->setTypeFilter($searchAccount::userType) ; // limité aux utilisateurs $searchAccount->setTypeFilter($searchAccount::userType | $searchAccount::groupType ) ;// limité aux utilisateurs et aux groupes $searchAccount->setTypeFilter($searchAccount::roleType) ; // limité aux rôles
Le paramètre est une combinaison des 3 constantes userType, groupType et roleType.
Par défaut, les comptes retournés ne sont pas liés aux privilèges du document
associé. Si on désire ne rechercher que parmi les comptes que l'utilisateur
courant a le droit de voir il faut rajouter l'appel à la méthode
SearchAccount::useViewControl()
avant l'appel à SearchAccount::search()
.
$searchAccount->useViewControl(true);
17.6.9 Spécialisation des documents utilisateurs
Les documents système "utilisateur" (famille IUSER
) peuvent être dérivés pour
ajouter des informations fonctionnelles ou pour ajouter des informations
techniques dans le cas d'un backend d'authentification spécifique.
La famille IUSER
n'impose pas de contrainte de syntaxe sur le login. La seule
contrainte est que ce "login" doit être unique parmi tous les comptes
(utilisateurs, groupes et rôles). Si vous voulez ajouter une contrainte de
syntaxe sur votre famille "utilisateur" dérivé de IUSER
vous devez surcharger
la méthode IUSER::constraintLogin()
qui est une méthode contrainte.
Exemple :
// constraint to limit login to 6 characters public function constraintLogin($login) { //only six alpha num $err = ''; if (!preg_match("/^[a-z0-9]{6}$/i", $login)) { $err = _("the login must have six characters"); } // must verify unicity also if (!$err) return parent::constraintLogin($login); return $err; }
Attention: lorsque la famille IUSER
est dérivée, il faut reprendre et adapter
le paramétrage en terme de sécurité (profil, contrôle de vue) en fonction de vos
besoins.