UserContext.php 4.7 KB
Newer Older
1
2
3
4
5
<?php

namespace UnicaenAuth\Service;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
6
7
use Zend\ServiceManager\ServiceLocatorAwareTrait;
use Zend\Session\Container as SessionContainer;
8
9
10
11
use ZfcUser\Entity\UserInterface;
use UnicaenAuth\Entity\Ldap\People;

/**
12
 * Service centralisant des méthodes utiles concernant l'utilisateur authentifié.
13
14
15
16
17
 *
 * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
 */
class UserContext implements ServiceLocatorAwareInterface
{
18
    use ServiceLocatorAwareTrait;
19
20
21
22
23

    /**
     * @var mixed
     */
    protected $identity;
24
    
25
    /**
26
     * @var array 
27
     */
28
29
30
31
32
33
    protected $identityRoles;
    
    /**
     * @var SessionContainer
     */
    protected $sessionContainer;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

    /**
     * Retourne l'utilisateur BDD courant
     *
     * @return UserInterface
     */
    public function getDbUser()
    {
        if (($identity = $this->getIdentity())) {
            if (isset($identity['db']) && $identity['db'] instanceof UserInterface) {
                return $identity['db'];
            }
        }
        return null;
    }

    /**
     * Retourne l'utilisateur LDAP courant
     *
     * @return People
     */
    public function getLdapUser()
    {
        if (($identity = $this->getIdentity())) {
            if (isset($identity['ldap']) && $identity['ldap'] instanceof People) {
                return $identity['ldap'];
            }
        }
        return null;
    }

    /**
66
     * Retourne l'identité correspondant à l'utilisateur courant.
67
     *
68
     * @return mixed
69
     */
70
    protected function getIdentity()
71
    {
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
        if (null === $this->identity) {
            $authenticationService = $this->getServiceLocator()->get('Zend\Authentication\AuthenticationService');
            if ($authenticationService->hasIdentity()) {
                $this->identity = $authenticationService->getIdentity();
            }
        }
        return $this->identity;
    }
    
    /**
     * Retourne les rôles de l'utilisateur courant.
     * 
     * @return array
     */
    public function getIdentityRoles()
    {
        if (null === $this->identityRoles) {
            $authorize = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize');
            $identityProvider = $authorize->getIdentityProvider();
            $this->identityRoles = $identityProvider->getIdentityRoles();
        }
        return $this->identityRoles;
    }
    
    /**
     * Retourne les rôles de l'utilisateur courant qui peuvent être sélectionnés.
     * 
     * @return array
     */
    public function getSelectableIdentityRoles()
    {
        return array_filter(
                $this->getIdentityRoles(), 
                function($r) { return !($r instanceof \UnicaenAuth\Acl\NamedRole && !$r->getSelectable()); });
    }
    
    /**
     * Retourne le rôle utilisateur sélectionné, ou le premier sélectionnable si aucun n'a été sléectionné.
     * 
     * @return mixed
     */
    public function getSelectedIdentityRole()
    {
        if (null === $this->getSessionContainer()->selectedIdentityRole) {
            $roles = $this->getSelectableIdentityRoles();
            $this->getSessionContainer()->selectedIdentityRole = reset($roles) ?: null;
        }
        return $this->getSessionContainer()->selectedIdentityRole;
    }
    
    /**
     * Mémorise le rôle courant de l'utilisateur.
     * 
     * @param mixed $role
     * @return \UnicaenAuth\Service\UserContext
     */
    public function setSelectedIdentityRole($role)
    {
        if ($role) {
            if (!$this->isRoleValid($role)) {
                throw new \Common\Exception\RuntimeException("Rôle spécifié invalide.");
            }
            $this->getSessionContainer()->selectedIdentityRole = $role;
        }
        else {
            unset($this->getSessionContainer()->selectedIdentityRole);
        }
139
140
        return $this;
    }
141
    
142
    /**
143
144
145
146
     * Teste si le rôle spécifié fait partie des rôles disponibles.
     * 
     * @param mixed $role
     * @return boolean
147
     */
148
    protected function isRoleValid($role)
149
    {
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
        foreach ($this->getIdentityRoles() as $r) {
            if ($r instanceof \Zend\Permissions\Acl\Role\RoleInterface) {
                $r = $r->getRoleId();
            }
            if ($role === $r) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Retourne le stockage en session utilisé pour mémoriser le profil 
     * sélectionné par l'utilsateur.
     * 
     * @return SessionContainer
     */
    protected function getSessionContainer()
    {
        if (null === $this->sessionContainer) {
            $this->sessionContainer = new SessionContainer(get_class());
        }
        return $this->sessionContainer;
173
174
    }
}