AuthController.php 4.17 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace UnicaenAuth\Controller;

use UnicaenApp\Exception\RuntimeException;
use UnicaenAuth\Service\Traits\ShibServiceAwareTrait;
use UnicaenAuth\Service\Traits\UserServiceAwareTrait;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Exception\ExceptionInterface;
use Zend\Http\Response;
use Zend\Mvc\Controller\AbstractActionController;
Bertrand Gauthier's avatar
Bertrand Gauthier committed
12
use ZfcUser\Controller\Plugin\ZfcUserAuthentication;
13
14
15
16

/**
 * Classe ajoutée lors de l'implémentation de l'auth Shibboleth.
 *
Bertrand Gauthier's avatar
Bertrand Gauthier committed
17
 * @method ZfcUserAuthentication zfcUserAuthentication()
18
19
20
21
22
23
24
25
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 */
class AuthController extends AbstractActionController
{
    use ShibServiceAwareTrait;
    use UserServiceAwareTrait;

    /**
26
27
28
29
30
31
32
33
34
35
36
37
     * Cette action peut être appelée lorsque l'authentification Shibboleth est activée
     * (unicaen-auth.shibboleth.enable === true).
     *
     * > Si la config Apache de Shibboleth est correcte, une requête à l'adresse correspondant à cette action
     * (suite au clic sur le bouton "Authentification Shibboleth", typiquement)
     * est détournée par Apache pour réaliser l'authentification Shibboleth.
     * Ce n'est qu'une fois l'authentification réalisée avec succès que cette action est appelée.
     *
     * > Si la config Apache de Shibboleth est incorrecte ou absente (localhost par exemple), et que la simulation
     * Shibboleth est activée dans la config (unicaen-auth.shibboleth.simulate), cette action est appelée et
     * la simulation est enclenchée.
     *
38
39
40
41
     * @return Response|array
     */
    public function shibbolethAction()
    {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
42
43
44
        $operation = $this->params()->fromRoute('operation');

        if ($operation === 'deconnexion') {
45
            return $this->shibbolethLogout();
Bertrand Gauthier's avatar
Bertrand Gauthier committed
46
        }
47

48
        $redirectUrl = $this->params()->fromQuery('redirect', '/');
49

50
51
52
53
54
        // enclenchement de la simulation shibboleth éventuellement activée dans la config
        if ($simulate = $this->shibService->getShibbolethSimulate()) {
            $this->setStoredAuthenticatedUsername($simulate['eppn']); // tout simplement!

            return $this->redirect()->toUrl($redirectUrl);
Bertrand Gauthier's avatar
Bertrand Gauthier committed
55
56
        }

57
58
59
        $shibUser = $this->shibService->getAuthenticatedUser();
        if ($shibUser === null) {
            return []; // une page d'aide s'affichera si les données issues de Shibboleth attendues sont absentes
60
        }
Bertrand Gauthier's avatar
Bertrand Gauthier committed
61

62
        // arrivé ici, l'authentification shibboleth a été faite en bonne et due forme et a réussie.
Bertrand Gauthier's avatar
Bertrand Gauthier committed
63

64
65
        $this->setStoredAuthenticatedUsername($shibUser->getUsername());
        $this->userService->userAuthenticated($shibUser);
66

Bertrand Gauthier's avatar
Bertrand Gauthier committed
67
68
69
        return $this->redirect()->toUrl($redirectUrl);
    }

70
71
72
73
74
75
    /**
     * Déconnexion Shibboleth.
     *
     * @return array|Response
     */
    private function shibbolethLogout()
Bertrand Gauthier's avatar
Bertrand Gauthier committed
76
    {
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        // déconnexion applicative quoiqu'il arrive
        $this->zfcUserAuthentication()->getAuthAdapter()->resetAdapters();
        $this->zfcUserAuthentication()->getAuthAdapter()->logoutAdapters();
        $this->zfcUserAuthentication()->getAuthService()->clearIdentity();

        // déconnexion Shibboleth le cas échéant
        if ($this->shibService->isShibbolethEnabled()) {
            // désactivation de l'usurpation d'identité éventuelle
            $this->shibService->deactivateUsurpation();

            // URL par défaut vers laquelle on redirige après déconnexion : accueil
            $homeUrl = $this->url()->fromRoute('home', [], ['force_canonical' => true]);
            $returnAbsoluteUrl = $this->params()->fromQuery('return', $homeUrl);

            return $this->redirect()->toUrl($this->shibService->getLogoutUrl($returnAbsoluteUrl));
        } else {
            return []; // une page d'aide s'affichera
        }
    }
96

97
98
99
100
101
102
103
104
105
106
107
108
    /**
     * @param string $username
     */
    private function setStoredAuthenticatedUsername($username)
    {
        /** @var AuthenticationService $authService */
        $authService = $this->getServiceLocator()->get('zfcuser_auth_service');
        try {
            $authService->getStorage()->write($username);
        } catch (ExceptionInterface $e) {
            throw new RuntimeException("Impossible d'écrire dans le storage");
        }
109
110
    }
}