source: spip-zone/_plugins_/simplesaml/trunk/auth/simplesaml.php @ 93429

Last change on this file since 93429 was 93429, checked in by marcimat@…, 4 years ago

Oups, résidu.

File size: 4.5 KB
Line 
1<?php
2/**
3 * Fichier gérant l'installation et désinstallation du plugin Authentification SAML
4 *
5 * @plugin     Authentification SAML
6 * @copyright  2015
7 * @author     Matthieu Marcillaud
8 * @licence    GNU/GPL
9 * @package    SPIP\SimpleSaml\Authentification
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) return;
13
14
15/**
16 * Identifie dans SPIP l'auteur connecté par SAML
17 *
18 * @param \SimpleSAML_Auth_Simple $simplesaml
19 * @return bool
20 *     True si réussi, false sinon.
21**/
22function simplesaml_auth_loger() {
23
24        $simplesaml = new SimpleSAML_Auth_Simple('default-sp');
25        if (!$simplesaml->isAuthenticated()) {
26                return false;
27        }
28
29        $nameid     = $simplesaml->getAuthData('saml:sp:NameID');
30        $nameid     = $nameid['Value'];
31
32        $attributes = $simplesaml->getAttributes();
33        $login      = $attributes['uid'][0];
34        $prenom     = $attributes['gn'][0];
35        $nom        = $attributes['sn'][0];
36        $email      = $attributes['email'][0];
37
38        if ($prenom) {
39                $nom = $prenom . ' ' . $nom;
40        }
41
42        if (!$nameid) {
43                spip_log("No NameID found in SAML data, cancel login", 'simplesaml.' . _LOG_ERREUR);
44                return false;
45        }
46
47        spip_log("Authentification reussi pour l'utilisateur = " . $email, 'simplesaml');
48
49        // chercher notre auteur, s'il existe.
50        // nameid
51        $auteur = sql_fetsel('*', 'spip_auteurs', array(
52                'source = ' . sql_quote('saml'),
53                'statut != ' . sql_quote('5poubelle'),
54                'nameid = ' . sql_quote($nameid)
55        ));
56
57        // sinon uid.
58        if (!$auteur) {
59                $auteur = sql_fetsel('*', 'spip_auteurs', array(
60                        'source = ' . sql_quote('saml'),
61                        'statut != ' . sql_quote('5poubelle'),
62                        'login = ' . sql_quote($login)
63                ));
64        }
65
66        include_spip('action/editer_auteur');
67        if (!$auteur) {
68                $id_auteur = auteur_inserer('saml', array(
69                        'login'   => $login,
70                        'statut'  => '6forum',
71                        'nameid'  => $nameid,
72                        'nom'     => $nom,
73                        'email'   => $email
74                ));
75                if (!$id_auteur) {
76                        spip_log('impossible de créer le nouvel auteur spip', 'simplesaml');
77                        return false;
78                }
79        } else {
80                $id_auteur = $auteur['id_auteur'];
81                // mettre à jour ses données
82                sql_updateq(
83                        'spip_auteurs',
84                        array(
85                                'login'   => $login,
86                                'nameid'  => $nameid,
87                                'nom'     => $nom,
88                                'email'   => $email
89                        ),
90                        'id_auteur = ' . $id_auteur
91                );
92        }
93
94        $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $id_auteur);
95        include_spip('inc/auth');
96        return auth_loger($auteur);
97}
98
99
100
101/**
102 * Vider les sessions de l'auteur connecté
103**/
104function simplesaml_vider_sessions() {
105        // le logout explicite vaut destruction de toutes les sessions
106        if (isset($_COOKIE['spip_session'])) {
107                include_spip('inc/cookie');
108                $session = charger_fonction('session', 'inc');
109                $session($GLOBALS['visiteur_session']['id_auteur']);
110                spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
111        }
112}
113
114
115/**
116 * Si une authentification a déjà été réalisée sur un autre sous-domaine de ce domaine,
117 * on va se loger automatiquement sur le fournisseur d'identité.
118 *
119 * Pour savoir si c'est le cas, on teste la présence d'un cookie, cookie qui doit
120 * s'appliquer sur tout le domaine, tel que '.domaine.tld'
121 *
122 * Le nom et la valeur du cookie sont à définir en configuration.
123 *
124 * @param string $url URL de retour
125 * @return bool
126 *     True si réussi, false sinon.
127**/
128function simplesaml_auth_autologer() {
129        include_spip('lire_config');
130        if (lire_config('simplesaml/autologer/activer')) {
131                $simplesaml = new SimpleSAML_Auth_Simple('default-sp');
132                if (!$simplesaml->isAuthenticated()) {
133                        $cookie = lire_config('simplesaml/autologer/cookie/nom');
134                        $valeur = lire_config('simplesaml/autologer/cookie/valeur');
135                        if (isset($_COOKIE[$cookie]) and ($_COOKIE[$cookie] == $valeur)) {
136                                // a priori on est identifié sur le même domaine quelque part.
137                                $simplesaml->requireAuth();
138                        }
139                }
140        }
141}
142
143
144/**
145 * Déloge du SSO si on y est authentifié
146 *
147 * Provoque une redirection vers le SSO pour ça si besoin
148 *
149 * @param string $url URL de retour
150**/
151function simplesaml_auth_deloger($url) {
152        $simplesaml = new SimpleSAML_Auth_Simple('default-sp');
153        if ($simplesaml->isAuthenticated()) {
154                simplesaml_vider_sessions();
155                $simplesaml->logout(url_absolue($url));
156                // normalement… ça doit rediriger
157        }
158}
159
160
161/**
162 * Déloge de SPIP un auteur s'il n'est plus connecté au SSO
163 *
164 * @param string $url URL de retour
165**/
166function simplesaml_auth_deloger_spip_si_besoin($url) {
167        $simplesaml = new SimpleSAML_Auth_Simple('default-sp');
168        if (!$simplesaml->isAuthenticated()) {
169                // aucasou on serait effectivement logé ailleurs sur le SSO
170                simplesaml_auth_autologer();
171
172                // sinon, tuer notre session SPIP
173                simplesaml_vider_sessions();
174                include_spip('inc/headers');
175                redirige_par_entete(self());
176        }
177}
Note: See TracBrowser for help on using the repository browser.