Chain.php 3.33 KB
Newer Older
1
<?php
2

3
4
5
namespace UnicaenAuth\Provider\Identity;

use BjyAuthorize\Provider\Identity\ProviderInterface;
6
use BjyAuthorize\Service\Authorize;
7
use Zend\EventManager\EventManagerAwareInterface;
8
use Zend\EventManager\EventManagerAwareTrait;
9
use Zend\Permissions\Acl\Role\Registry;
10
11
use Zend\Permissions\Acl\Role\RoleInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
12
use Zend\ServiceManager\ServiceLocatorAwareTrait;
13
14
15
16
17
18
19

/**
 * Chaîne de responsabilité permettant à plusieures sources de fournir
 * les rôles (ACL) de l'identité authentifiée éventuelle.
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 * @see ChainEvent
20
 * @see \UnicaenAuth\Provider\Identity\ChainServiceFactory
21
22
23
 */
class Chain implements ProviderInterface, ServiceLocatorAwareInterface, EventManagerAwareInterface
{
24
25
    use ServiceLocatorAwareTrait;
    use EventManagerAwareTrait;
26

27
28
29
30
    /**
     * @var ChainEvent
     */
    protected $event;
31

32
33
34
35
    /**
     * @var array
     */
    protected $roles;
36

37
    /**
38
39
     * Retourne lee roles de l'utilisateur courant.
     * Si un rôle courant est sélectionné, c'est lui qu'on retourne.
40
41
42
43
     *
     * @return string[]|RoleInterface[]
     */
    public function getIdentityRoles()
44
45
    {
        $allRoles             = $this->getAllIdentityRoles();
46
        $selectedIdentityRole = $this->getSelectedIdentityRole();
47
48
        $roles                = $selectedIdentityRole ? [$selectedIdentityRole] : $allRoles;

49
50
        return $roles;
    }
51

52
53
    /**
     * Retourne l'éventuel rôle courant sélectionné.
54
     *
55
56
57
58
59
60
     * @return mixed
     */
    private function getSelectedIdentityRole()
    {
        return $this->getServiceLocator()->get('AuthUserContext')->getSelectedIdentityRole();
    }
61

62
63
    /**
     * Collecte tous les rôles de l'utilisateur.
64
     *
65
66
67
     * @return array
     */
    public function getAllIdentityRoles()
68
69
70
71
    {
        if (null !== $this->roles) {
            return $this->roles;
        }
72
73
74

        $this->roles = [];

75
76
        $e = $this->getEvent();
        $e->clearRoles();
77

78
79
        // collecte des rôles
        $this->getEventManager()->trigger('getIdentityRoles', $e);
80
        $roles = $e->getRoles(); /** @var RoleInterface[] $roles */
81

82
        $authorizeService = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize'); /* @var $authorizeService Authorize */
83

84
        $registry = new Registry();
85
86
87
88
89
90
91
        foreach ($roles as $role) {
            // ne retient que les rôles déclarés dans les ACL
            if (!$authorizeService->getAcl()->hasRole($role)) {
                continue;
            }
            // évite les doublons
            if (!$registry->has($role)) {
92
93
94
                if (is_string($role)) {
                    $role = $authorizeService->getAcl()->getRole($role);
                }
95
                $registry->add($role);
96
                $this->roles[$role->getRoleId()] = $role;
97
98
            }
        }
99

100
101
        return $this->roles;
    }
102

103
    /**
104
     *
105
106
107
108
109
110
111
112
113
114
115
116
     * @return ChainEvent
     */
    public function getEvent()
    {
        if (null === $this->event) {
            $this->event = new ChainEvent();
            $this->event->setTarget($this);
        }
        return $this->event;
    }

    /**
117
     *
118
119
120
121
122
123
124
125
126
     * @param ChainEvent $event
     * @return self
     */
    public function setEvent(ChainEvent $event)
    {
        $this->event = $event;
        return $this;
    }
}