Skip to content
Snippets Groups Projects
Commit 5a6964ea authored by lecluse's avatar lecluse
Browse files

#1344

IdentityProdiver,
RoleProvider
Context

et ACL/Role mis à niveau.

Reste à mettre en place le RuleProvider et à mettre à niveau le système d'assertions.
Reste également la définition des provilèges et l'adaptation de tout le code source de OSE
parent 5f645dbe
Branches
Tags
No related merge requests found
......@@ -2,41 +2,19 @@
namespace Application\Acl;
use UnicaenAuth\Acl\NamedRole;
use Application\Interfaces\StructureAwareInterface;
use Application\Interfaces\IntervenantAwareInterface;
use Application\Traits\IntervenantAwareTrait;
use Application\Traits\StructureAwareTrait;
/**
* Description of IntervenantRole
*
* @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
* @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
*/
class IntervenantRole extends Role implements StructureAwareInterface, IntervenantAwareInterface
class IntervenantRole extends Role
{
use StructureAwareTrait;
use IntervenantAwareTrait;
const ROLE_ID = "intervenant";
public function __construct($id = self::ROLE_ID, $parent = Role::ROLE_ID, $name = 'Intervenant', $description = null, $selectable = true)
{
parent::__construct($id, $parent, $name, $description, $selectable);
}
/**
*
* @param Resource|string $resource
* @param Privilege|string $privilege
*/
function hasPrivilege( $resource, $privilege )
{
if ($statut = $this->getIntervenant()->getStatut()){
return $statut->hasPrivilege($resource, $privilege);
}
return false;
}
}
......
......@@ -4,8 +4,6 @@ namespace Application\Acl;
use UnicaenAuth\Acl\NamedRole;
use Application\Entity\Db\Role as DbRole;
use Zend\Permissions\Acl\Resource;
use Application\Entity\Db\Privilege;
/**
* Rôle père de tous les rôles "administrateur".
......@@ -14,6 +12,9 @@ use Application\Entity\Db\Privilege;
*/
class Role extends NamedRole
{
use \Application\Traits\StructureAwareTrait,
\Application\Traits\PersonnelAwareTrait,
\Application\Traits\IntervenantAwareTrait;
const ROLE_ID = 'role';
......@@ -35,27 +36,14 @@ class Role extends NamedRole
*
* @return RoleEntity
*/
function getDbRole()
public function getDbRole()
{
return $this->role;
return $this->dbRole;
}
function setDbRole(DbRole $dbRole)
public function setDbRole(DbRole $dbRole)
{
$this->dbRole = $dbRole;
return $this;
}
/**
*
* @param Resource|string $resource
* @param Privilege|string $privilege
*/
function hasPrivilege( $resource, $privilege )
{
if ($typeRole = $this->getTypeRole()){
return $typeRole->hasPrivilege($resource, $privilege);
}
return false;
}
}
\ No newline at end of file
......@@ -2,16 +2,11 @@
namespace Application\Provider\Identity;
use Application\Acl;
use Application\Entity\Db\IntervenantExterieur;
use Application\Entity\Db\IntervenantPermanent;
use Application\Entity\Db\Affectation;
use Application\Entity\Db\Utilisateur;
use Common\Exception\RuntimeException;
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
use UnicaenAuth\Provider\Identity\ChainableProvider;
use UnicaenAuth\Provider\Identity\ChainEvent;
use Zend\Permissions\Acl\Role\RoleInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
......@@ -30,11 +25,6 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide
*/
protected $roles;
public function init()
{
$this->getEntityManager()->getFilters()->enable('historique');
}
/**
* {@inheritDoc}
*/
......@@ -49,106 +39,45 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide
public function getIdentityRoles()
{
if (null === $this->roles) {
$this->roles = [];
if (!$this->getServiceLocator()->get('AuthUserContext')->getIdentity()) {
return $this->roles;
}
$this->getEntityManager()->getFilters()->enable('historique')->init(
[
'Application\Entity\Db\Role',
'Application\Entity\Db\Affectation',
],
new \DateTime
);
/**
* Rôles que possède l'utilisateur dans la base de données.
*/
$this->roles = array_merge($this->roles, $this->getDbRoles());
/**
* Rôle correspondant au type d'intervenant auquel appartient l'utilisateur
*/
$intervenantRole = $this->getIntervenantRole();
if ($intervenantRole){
$this->roles[] = $intervenantRole;
}
}
//var_dump($this->roles);
return $this->roles;
}
$this->roles = [];
/**
* Fetch dans la base de données les rôles que possède l'utilisateur sur une structure précise.
*
* @return array Id des rôles trouvés
*/
protected function getDbRoles()
{
$utilisateur = $this->getDbUser();
$roles = [];
$serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
/* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
$utilisateur = $serviceAuthUserContext->getDbUser();
/* @var $utilisateur \Application\Entity\Db\Utilisateur */
if (!$utilisateur) {
return $roles;
}
if (! $utilisateur) return $this->roles; // pas connecté
/**
* Responsabilités métier importées (tables affectation et TYPE_ROLE)
* Rôles que possède l'utilisateur dans la base de données.
*/
if ($utilisateur->getPersonnel()) {
foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) { /* @var $affectation Affectation */
foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) {
/* @var $affectation Affectation */
$roleId = $affectation->getRole()->getCode();
if ($structure = $affectation->getStructure()){
$roleId .= '-'.$structure->getSourceCode();
}
$roles[] = $roleId;
$this->roles[] = $roleId;
}
}
return $roles;
}
/**
* Retourne le rôle correspondant au type d'intervenant auquel appartient l'utilisateur.
*
* @return RoleInterface|null
* Rôle correspondant au type d'intervenant auquel appartient l'utilisateur
*/
protected function getIntervenantRole()
{
$utilisateur = $this->getDbUser();
if (!$utilisateur) {
return null;
}
$intervenant = $utilisateur->getIntervenant();
if (!$intervenant) {
return Acl\IntervenantRole::ROLE_ID;
if ($intervenant){
$this->roles[] = Acl\IntervenantRole::ROLE_ID;
}
$statut = $intervenant->getStatut()->getSourceCode();
if ($statut === \Application\Entity\Db\StatutIntervenant::NON_AUTORISE){
return null;
}
if ($intervenant instanceof IntervenantPermanent) {
$role = Acl\IntervenantPermanentRole::ROLE_ID;
}
elseif ($intervenant instanceof IntervenantExterieur) {
$role = Acl\IntervenantExterieurRole::ROLE_ID;
}
else {
throw new RuntimeException("Type d'intervenant inattendu : " . get_class($intervenant));
}
return $role;
}
/**
* Retourne l'utilisateur connecté.
*
* @return Utilisateur
*/
private function getDbUser()
{
return $this->getServiceLocator()->get('AuthUserContext')->getDbUser(); /* @var $dbUser Utilisateur */
return $this->roles;
}
}
......@@ -16,7 +16,7 @@ class IdentityProviderFactory implements FactoryInterface
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return Acteur
* @return IdentityProvider
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
......@@ -24,7 +24,6 @@ class IdentityProviderFactory implements FactoryInterface
$identityProvider = new IdentityProvider;
$identityProvider->setEntityManager($em);
$identityProvider->init();
return $identityProvider;
}
}
\ No newline at end of file
<?php
namespace Application\Provider\Identity;
use Application\Acl;
use Application\Entity\Db\IntervenantExterieur;
use Application\Entity\Db\IntervenantPermanent;
use Application\Entity\Db\Affectation;
use Application\Entity\Db\Utilisateur;
use Common\Exception\RuntimeException;
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
use UnicaenAuth\Provider\Identity\ChainableProvider;
use UnicaenAuth\Provider\Identity\ChainEvent;
use Zend\Permissions\Acl\Role\RoleInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
/**
* Classe chargée de fournir les rôles que possède l'identité authentifiée.
*
* @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
*/
class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvider, EntityManagerAwareInterface
{
use ServiceLocatorAwareTrait;
use EntityManagerAwareTrait;
/**
* @var array
*/
protected $roles;
/**
* {@inheritDoc}
*/
public function injectIdentityRoles(ChainEvent $event)
{
$event->addRoles($this->getIdentityRoles());
}
/**
* {@inheritDoc}
*/
public function getIdentityRoles()
{
if (null === $this->roles) {
$this->roles = [];
$serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
/* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
$utilisateur = $serviceAuthUserContext->getDbUser();
if (! $utilisateur) return $this->roles; // pas connecté
/**
* Rôles que possède l'utilisateur dans la base de données.
*/
if ($utilisateur->getPersonnel()) {
foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) {
/* @var $affectation Affectation */
$roleId = $affectation->getRole()->getCode();
if ($structure = $affectation->getStructure()){
$roleId .= '-'.$structure->getSourceCode();
}
$this->roles[] = $roleId;
}
}
/**
* Rôle correspondant au type d'intervenant auquel appartient l'utilisateur
*/
$intervenant = $utilisateur->getIntervenant();
if ($intervenant){
$this->roles[] = Acl\IntervenantRole::ROLE_ID;
}
}
return $this->roles;
}
}
......@@ -2,16 +2,15 @@
namespace Application\Provider\Role;
use Application\Acl\AdministrateurRole;
use Application\Entity\Db\Affectation;
use Application\Entity\Db\Structure as StructureEntity;
use Application\Interfaces\StructureAwareInterface;
use BjyAuthorize\Provider\Role\ProviderInterface;
use Exception;
use UnicaenApp\Exception\LogicException;
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
use Zend\Permissions\Acl\Role\RoleInterface;
use Application\Acl\Role;
use Application\Acl\IntervenantRole;
/**
* Fournisseur des rôles utilisateurs de l'application :
......@@ -34,6 +33,12 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
*/
protected $roles;
/**
* @var StructureEntity
*/
protected $structureSelectionnee;
/**
* Constructeur.
......@@ -64,7 +69,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
{
$roles = [];
// Chargement des rôles de base
/* deprecated */
foreach( $this->config as $classname ){
if (class_exists( $classname )){
$role = new $classname; /* @var $role RoleInterface */
......@@ -73,7 +78,22 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
throw new LogicException('La classe "'.$classname.'" déclarée dans la configuration du fournisseur de rôles n\'a pas été trouvée.');
}
}
if (($utilisateur = $this->getUtilisateur()) && ($personnel = $utilisateur->getPersonnel())){
/* fin de deprecated */
$serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
/* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
$utilisateur = $serviceAuthUserContext->getDbUser();
/* Cas spécifique du rôle intervenant */
if ($utilisateur && $utilisateur->getIntervenant()){
$role = new IntervenantRole;
$role->setIntervenant( $utilisateur->getIntervenant() );
$roles[$role->getRoleId()] = $role;
}
/* Rôles du personnel */
if ($utilisateur && ($personnel = $utilisateur->getPersonnel())){
// chargement des rôles métiers
$qb = $this->getEntityManager()->createQueryBuilder()
->from("Application\Entity\Db\Affectation", "a")
......@@ -85,62 +105,22 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
->andWhere('1=compriseEntre(r.histoCreation,r.histoDestruction)')
->andWhere("a.personnel = :personnel")->setParameter(':personnel', $personnel);
foreach ($qb->getQuery()->getResult() as $affectation) { /* @var $affectation Affectation */
$roleId = $affectation->getRole()->getCode();
if (! isset($roles[$roleId])){
throw new Exception('Le rôle "'.$roleId.'" est inconnu.');
}
$classname = get_class($roles[$roleId]);
if ($roles[$roleId] instanceof StructureAwareInterface && $affectation->getStructure()){
$roleId .= '-'.$affectation->getStructure()->getSourceCode();
$roles[$roleId] = new $classname($roleId);
$roles[$roleId]->setStructure( $affectation->getStructure() );
}else{
$roles[$roleId] = new $classname($roleId);
}
$roles[$roleId]->setDbRole( $affectation->getRole() );
$this->injectSelectedStructureInRole($roles[$roleId]);
}
}
return $roles;
}
$dbRole = $affectation->getRole();
$role = new Role( $dbRole->getCode(), 'user', $dbRole->getLibelle());
$role->setDbRole( $dbRole );
$role->setPersonnel( $personnel );
/**
*
* @return \Application\Entity\Db\Utilisateur
*/
public function getUtilisateur()
{
$identity = $this->getServiceLocator()->get('AuthUserContext')->getIdentity();
if (isset($identity['db'])){
return $identity['db'];
if ($this->structureSelectionnee){
$role->setStructure( $this->structureSelectionnee );
}else{
return null;
$role->setStructure( $affectation->getStructure() );
}
$roles[$role->getRoleId()] = $role;
}
/**
* Inject la structure sélectionnée en session dans le rôle Administrateur.
*
* @param \Application\Acl\Role $role
* @return self
*/
public function injectSelectedStructureInRole($role)
{
if (! $role instanceof AdministrateurRole) {
return $this;
}
$role->setStructure($this->structureSelectionnee);
return $this;
return $roles;
}
/**
* @var StructureEntity
*/
protected $structureSelectionnee;
public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
{
$this->structureSelectionnee = $structureSelectionnee;
......
......@@ -89,23 +89,17 @@ class Context extends AbstractService
if ($authUserContext->getIdentity()) {
$this->selectedIdentityRole = $authUserContext->getSelectedIdentityRole();
$utilisateur = $authUserContext->getDbUser();
if ($utilisateur){
if ($this->selectedIdentityRole instanceof IntervenantAwareInterface) {
$intervenant = $utilisateur->getIntervenant();
if (! $intervenant){ // sinon import automatique
if (
$this->selectedIdentityRole instanceof \Application\Acl\IntervenantRole
&& ! $this->selectedIdentityRole->getIntervenant()
){
// import automatique
$iSourceCode = (int)$authUserContext->getLdapUser()->getSupannEmpId();
$intervenant = $this->getServiceIntervenant()->importer($iSourceCode);
$this->selectedIdentityRole->setIntervenant( $intervenant ); // injection à la volée de l'intervenant
}
$this->selectedIdentityRole->setIntervenant( $intervenant );
}
if ($this->selectedIdentityRole instanceof PersonnelAwareInterface){
$this->selectedIdentityRole->setPersonnel( $utilisateur->getPersonnel() );
}
}
}
}
return $this->selectedIdentityRole;
}
......@@ -268,7 +262,7 @@ class Context extends AbstractService
$sc->structure = null;
}else{
$role = $this->getSelectedIdentityRole();
if ($role instanceof StructureAwareInterface && $role->getStructure()){
if ($role->getStructure()){
$sc->structure = $role->getStructure()->getId();
}else{
$sc->structure = null;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment