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
No related branches found
No related tags found
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