AuthController.php 3.24 KB
Newer Older
1
2
3
4
5
<?php

namespace UnicaenAuth\Controller;

use UnicaenApp\Exception\RuntimeException;
6
use UnicaenAuth\Service\ShibService;
7
8
9
10
11
12
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
13
use ZfcUser\Controller\Plugin\ZfcUserAuthentication;
14
15
16
17

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

    /**
27
28
29
30
31
32
33
34
35
36
     * Cette action n'est exécutée qu'une fois l'authentification Shibboleth réalisée avec succès.
     *
     * Lorsque l'authentification Shibboleth est activée (unicaen-auth.shibboleth.enable === true),
     * et que la config Apache est correcte, une requête à l'adresse correspondant à cette action
     * (suite au clic sur le bouton "Authentification Shibboleth, typiquement)
     * est détournée pour réaliser l'authentification.
     * Ce n'est qu'une fois l'authentification réalisée avec succès que cette action entre en jeu.
     *
     * @see ShibService::apacheConfigSnippet()
     *
37
38
39
40
     * @return Response|array
     */
    public function shibbolethAction()
    {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
41
42
43
44
45
46
47
48
49
        $operation = $this->params()->fromRoute('operation');

        if ($operation === 'deconnexion') {
            // 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
50
51
52
53
54
            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
Bertrand Gauthier's avatar
Bertrand Gauthier committed
55
56
                $homeUrl = $this->url()->fromRoute('home', [], ['force_canonical' => true]);
                $returnAbsoluteUrl = $this->params()->fromQuery('return', $homeUrl);
57

Bertrand Gauthier's avatar
Bertrand Gauthier committed
58
59
60
61
62
63
                return $this->redirect()->toUrl($this->shibService->getLogoutUrl($returnAbsoluteUrl));
            } else {
                return []; // une page d'aide s'affichera
            }
        }

64
65
66
        $shibUser = $this->shibService->getAuthenticatedUser();

        if ($shibUser === null) {
Bertrand Gauthier's avatar
Bertrand Gauthier committed
67
            return []; // une page d'aide s'affichera
68
69
70
71
72
        }

        /** @var AuthenticationService $authService */
        $authService = $this->getServiceLocator()->get('zfcuser_auth_service');
        try {
73
            $authService->getStorage()->write($shibUser->getUsername());
74
75
76
77
78
79
80
81
82
83
84
        } catch (ExceptionInterface $e) {
            throw new RuntimeException("Impossible d'écrire dans le storage");
        }

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

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

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