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;

    /**
Bertrand Gauthier's avatar
Bertrand Gauthier committed
26
27
     * Cette action peut être appelée lorsque l'authentification Shibboleth est activée
     * (unicaen-auth.shibboleth.enable === true).
28
     *
Bertrand Gauthier's avatar
Bertrand Gauthier committed
29
30
31
32
     * > 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.
33
     *
Bertrand Gauthier's avatar
Bertrand Gauthier committed
34
35
36
     * > 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.
37
     *
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') {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
45
            return $this->shibbolethLogout();
Bertrand Gauthier's avatar
Bertrand Gauthier committed
46
47
        }

Bertrand Gauthier's avatar
Bertrand Gauthier committed
48
49
50
51
52
53
54
55
        $redirectUrl = $this->params()->fromQuery('redirect', '/');

        // 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);
        }
56

Bertrand Gauthier's avatar
Bertrand Gauthier committed
57
        $shibUser = $this->shibService->getAuthenticatedUser();
58
        if ($shibUser === null) {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
            return []; // une page d'aide s'affichera si les données issues de Shibboleth attendues sont absentes
        }

        // arrivé ici, l'authentification shibboleth a été faite en bonne et due forme et a réussie.

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

        return $this->redirect()->toUrl($redirectUrl);
    }

    /**
     * Déconnexion Shibboleth.
     *
     * @return array|Response
     */
    private function shibbolethLogout()
    {
        // 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 {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
93
            return []; // une page d'aide s'affichera
94
        }
Bertrand Gauthier's avatar
Bertrand Gauthier committed
95
    }
96

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