Db.php 4.59 KB
Newer Older
Bertrand Gauthier's avatar
Bertrand Gauthier committed
1
2
3
4
<?php

namespace UnicaenAuth\Authentication\Storage;

5
use Doctrine\DBAL\DBALException;
6
use UnicaenApp\ServiceManager\ServiceLocatorAwareInterface;
7
8
use Zend\Authentication\Storage\Session;
use Zend\Authentication\Storage\StorageInterface;
9
use Zend\ServiceManager\Exception\ServiceNotFoundException;
10
use Zend\ServiceManager\ServiceLocatorAwareTrait;
11
use ZfcUser\Mapper\UserInterface as UserMapper;
Bertrand Gauthier's avatar
Bertrand Gauthier committed
12
13
14
15
16
17

/**
 * Db authentication storage.
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 */
18
class Db implements ChainableStorage, ServiceLocatorAwareInterface
Bertrand Gauthier's avatar
Bertrand Gauthier committed
19
{
20
21
    use ServiceLocatorAwareTrait;

22
    /**
23
     * @var StorageInterface
24
     */
25
26
27
28
29
30
    protected $storage;

    /**
     * @var UserMapper
     */
    protected $mapper;
31
32
33
34
35
36

    /**
     * @var mixed
     */
    protected $resolvedIdentity;

Bertrand Gauthier's avatar
Bertrand Gauthier committed
37
38
39
40
41
    /**
     * Returns the contents of storage
     *
     * Behavior is undefined when storage is empty.
     *
42
     * @param ChainEvent $e
Bertrand Gauthier's avatar
Bertrand Gauthier committed
43
     */
44
45
    public function read(ChainEvent $e)
    {
46
47
48
49
50
51
52
53
54
        if (!$this->resolvedIdentity) {
            $identity = $this->findIdentity();
            if ($identity) {
                $this->resolvedIdentity = $identity;
            } 
            else {
                $this->resolvedIdentity = null;
            }
        }
55
        
56
57
58
59
60
61
        $e->addContents('db', $this->resolvedIdentity);
    }

    /**
     * Writes $contents to storage
     *
62
     * @param ChainEvent $e
63
64
65
66
     */
    public function write(ChainEvent $e)
    {
        $contents = $e->getParam('contents');
67
        
68
69
        $this->resolvedIdentity = null;
        $this->getStorage()->write($contents);
70
71
72
73
74
    }

    /**
     * Clears contents from storage
     *
75
     * @param ChainEvent $e
76
77
78
79
     */
    public function clear(ChainEvent $e)
    {
        $this->resolvedIdentity = null;
80
        $this->getStorage()->clear();
81
82
83
84
85
86
    }
    
    /**
     * @return null
     */
    protected function findIdentity()
Bertrand Gauthier's avatar
Bertrand Gauthier committed
87
    {
88
89
90
91
92
93
94
        $id = $this->getStorage()->read();
        
        // si on obtient autre chose qu'un scalaire, l'utilisateur a déjà été 
        // recherché/trouvé dans la base de données
        if ($id && !is_scalar($id)) {
            return $id;
        }
95
96
97

        $identity = null;

98
        /**
99
         * 1ere tentative :
100
101
102
103
104
105
106
         * 
         * Recherche dans la base de données de l'utilisateur dont l'id correspond à ce qui
         * est stoqué en session.
         * 
         * NB: En cas de problème de connexion ou de service 'zfcuser_user_mapper' introuvable,
         * cela signifie sans doute que l'application n'utilise pas de table des utilisateurs.
         */
107
108
109
110
        if (is_int($id) || is_scalar($id)) {
            try {
                $identity = $this->getMapper()->findById($id);
            }
111
112
113
            catch (DBALException $dbale) {
                $identity = null;
            }
114
115
116
            catch (ServiceNotFoundException $e) {
                $identity = null;
            }
Bertrand Gauthier's avatar
Bertrand Gauthier committed
117
118
        }
        
119
120
121
122
123
124
125
126
127
        /**
         * 2e tentative : 
         * 
         * Recherche de l'utilisateur dont le supannAliasLogin correspond à ce qui
         * est stoqué en session.
         * 
         * NB: En cas de problème de connexion ou de service 'zfcuser_user_mapper' introuvable,
         * cela signifie sans doute que l'application n'utilise pas de table des utilisateurs.
         */
128
        if (is_string($id)) {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
129
            try {
130
                $identity = $this->getMapper()->findByUsername($id);
Bertrand Gauthier's avatar
Bertrand Gauthier committed
131
            }
132
133
134
            catch (DBALException $dbale) {
                $identity = null;
            }
135
136
137
            catch (ServiceNotFoundException $e) {
                $identity = null;
            }
Bertrand Gauthier's avatar
Bertrand Gauthier committed
138
        }
139
        
140
141
142
143
144
145
146
147
148
149
150
151
        return $identity;
    }

    /**
     * getStorage
     *
     * @return StorageInterface
     */
    public function getStorage()
    {
        if (null === $this->storage) {
            $this->setStorage(new Session());
Bertrand Gauthier's avatar
Bertrand Gauthier committed
152
        }
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
        return $this->storage;
    }

    /**
     * setStorage
     *
     * @param StorageInterface $storage
     * @access public
     * @return Db
     */
    public function setStorage(StorageInterface $storage)
    {
        $this->storage = $storage;
        return $this;
    }

    /**
     * getMapper
     *
     * @return UserMapper
     */
    public function getMapper()
    {
        if (null === $this->mapper) {
177
            $this->mapper = $this->serviceLocator->get('zfcuser_user_mapper');
178
179
180
181
182
183
184
185
186
187
188
189
190
191
        }
        return $this->mapper;
    }

    /**
     * setMapper
     *
     * @param UserMapper $mapper
     * @return Db
     */
    public function setMapper(UserMapper $mapper = null)
    {
        $this->mapper = $mapper;
        return $this;
Bertrand Gauthier's avatar
Bertrand Gauthier committed
192
    }
193
}