Skip to content
Snippets Groups Projects
Commit 46f392fe authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Doc sur l'authentification

parent 1f4df731
No related branches found
No related tags found
No related merge requests found
Authentification
================
L'application propose 4 modes d'authentification différents :
- [via la fédération d'identité Renater (Shibboleth)](auth_shib.md) : `shib` ;
- [via un serveur CAS (SSO)](auth_cas.md) : `cas` ;
- [auprès d'un annuaire LDAP](auth_ldap.md) : `ldap` ;
- [avec un compte local dans la BDD de l'application](auth_db.md) : `db`.
Plusieurs modes d'authentification peuvent être activés/proposés simultanément,
exemple : "Fédération d'identité" et "Compte local dans la BDD".
NB : Les modes `ldap` et `db` sont regroupés sous le pseudo-mode `local` du fait qu'il partage le même
formulaire de connexion.
La configuration de l'authentification se trouve dans les fichiers
`config/autoload/xxxx.local.php` et
`config/autoload/xxxx.secret.local.php` sous la clé `'unicaen-auth'`.
> Le mode `db` doit obligatoirement être activé pour garantir que des personnes extérieures à votre SI (ex : rapporteurs)
puissent accéder à l'application.
Usurpation d'identité
---------------------
L'application permet d'usurper l'identité d'un utilisateur, autrement dit de se faire passer pour lui.
Cette fonctionnalité est intéressante lorsqu'on fait de la documentation et/ou qu'on veut valider le bon fonctionnement
pour un rôle particulier. *Elle est bien entendu réservée à une instance de test ou de formation et pas à une instance
de production.*
Seuls les utilisateurs listés dans la configuration seront habilités à usurper une identité.
Exemple de configuration dans `config/autoload/xxxx.secret.local.php` :
```php
'unicaen-auth' => [
//...
/**
* Identifiants de connexion des utilisateurs autorisés à faire de l'usurpation d'identité.
* (NB: à réserver exclusivement aux instances de test/formation.)
*/
'usurpation_allowed_usernames' => [
//'username', // format d'identifiant LDAP
//'e.mail@domain.fr', // format BDD
//'eppn@domain.fr', // format Shibboleth
],
],
```
L'usurpation d'identité est proposée au utilisateurs habilités à 3 endroits différents dans l'application :
- sur la fiche Thèse (ex : usurpation de l'identité du doctorant) : bouton à cliquer ;
- sur la fiche d'un utilisateur (menu Administration > Utilisateurs, recherche puis sélection de l'utilisateur) : bouton à cliquer ;
- sur l'encart s'affichant lorsqu'on clique sur son nom dans le bandeau supérieur des pages de l'application : champ de saisie d'un identifiant de connexion.
> NB : par définition on usurpe un compte *utilisateur* donc seules les personnes existant dans la table des utilisateurs
peuvent faire l'objet d'une usurpation d'identité.
Authentification via un serveur CAS (SSO)
=========================================
Exemple de configuration dans `config/autoload/xxxx.local.php` :
```php
'unicaen-auth' => [
//...
/**
* Configuration de l'authentification centralisée (CAS).
*/
'cas' => [
/**
* Ordre d'affichage du formulaire de connexion.
*/
'order' => 1,
/**
* Activation ou non de ce mode d'authentification.
*/
'enabled' => true,
/**
* Description facultative de ce mode d'authentification qui apparaîtra sur la page de connexion.
*/
'description' => "Cliquez sur le bouton ci-dessous pour accéder à l'authentification centralisée.",
],
```
Exemple de configuration dans `config/autoload/xxxx.secret.local.php` :
```php
'unicaen-auth' => [
//...
/**
* Configuration de l'authentification centralisée (CAS).
*/
'cas' => [
/**
* Infos de connexion au serveur CAS.
*/
'connection' => [
'default' => [
'params' => [
'hostname' => 'host.domain.fr',
'port' => 443,
'version' => "2.0",
'uri' => "",
'debug' => false,
],
],
]
],
```
Adaptations à faire selon votre contexte :
- Infos de connexion au serveur CAS.
\ No newline at end of file
Authentification avec un compte local en base de données
========================================================
Ce mode d'authentification **doit** être activé.
Exemple de configuration dans `config/autoload/xxxx.local.php` :
```php
'unicaen-auth' => [
//...
/**
* Configuration de l'authentification locale (compte LDAP établissement, ou compte BDD application).
*/
'local' => [
/**
* Ordre d'affichage du formulaire de connexion.
*/
'order' => 2,
/**
* Description facultative de ce mode d'authentification qui apparaîtra sur la page de connexion.
*/
'description' => "Utilisez ce formulaire si vous possédez un compte local dédié à l'application.",
/**
* Mode d'authentification à l'aide d'un compte dans la BDD de l'application.
*/
'db' => [
/**
* Activation ou non de ce mode d'authentification.
*/
'enabled' => true, // doit être activé
],
//...
],
```
Authentification auprès d'un annuaire LDAP
==========================================
Exemple de configuration dans `config/autoload/xxxx.local.php` :
```php
'domain-auth' => [
//...
/**
* Configuration de l'authentification locale (compte LDAP établissement, ou compte BDD application).
*/
'local' => [
/**
* Ordre d'affichage du formulaire de connexion.
*/
'order' => 2,
/**
* Description facultative de ce mode d'authentification qui apparaîtra sur la page de connexion.
*/
'description' => "Utilisez ce formulaire si vous possédez un compte LDAP établissement ou un compte local dédié à l'application.",
/**
* Mode d'authentification à l'aide d'un compte LDAP.
*/
'ldap' => [
'enabled' => false,
],
//...
],
```
En cas d'activation du mode d'authentification LDAP, la connexion à l'annuaire LDAP *avec un compte admin* ainsi
que certains paramètres de fonctionnement doivent être configurés dans `config/autoload/xxxx.secret.local.php`
sous la clé `'domain-app'`, exemple :
```php
'unicaen-app' => [
//...
/**
* Paramètres de fonctionnement LDAP.
*/
'ldap' => [
/**
* Connexion à l'annuaire LDAP (NB: compte admin requis)
*/
'connection' => [
'default' => [
'params' => [
'host' => 'host.domain.fr',
'username' => "uid=xxxxxxxxx,ou=xxxxxxxxxx,dc=domain,dc=fr",
'password' => "xxxxxxxxxxxx",
'baseDn' => "ou=xxxxxxxxxxx,dc=domain,dc=fr",
'bindRequiresDn' => true,
'accountFilterFormat' => '(&(objectClass=posixAccount)(supannAliasLogin=%s))',
]
]
],
/**
* Paramètres de fonctionnement.
*/
'dn' => [
'UTILISATEURS_BASE_DN' => 'ou=people,dc=domain,dc=fr',
'UTILISATEURS_DESACTIVES_BASE_DN' => 'ou=deactivated,dc=domain,dc=fr',
// 'GROUPS_BASE_DN' => 'ou=groups,dc=domain,dc=fr',
// 'STRUCTURES_BASE_DN' => 'ou=structures,dc=domain,dc=fr',
],
'filters' => [
'LOGIN_FILTER' => '(supannAliasLogin=%s)',
// 'UTILISATEUR_STD_FILTER' => '(|(uid=p*)(&(uid=e*)(eduPersonAffiliation=student)))',
// 'CN_FILTER' => '(cn=%s)',
// 'NAME_FILTER' => '(cn=%s*)',
// 'UID_FILTER' => '(uid=%s)',
// 'NO_INDIVIDU_FILTER' => '(supannEmpId=%08s)',
// 'AFFECTATION_FILTER' => '(&(uid=*)(eduPersonOrgUnitDN=%s))',
// 'AFFECTATION_CSTRUCT_FILTER' => '(&(uid=*)(|(ucbnSousStructure=%s;*)(supannAffectation=%s;*)))',
// 'LOGIN_OR_NAME_FILTER' => '(|(supannAliasLogin=%s)(cn=%s*))',
// 'MEMBERSHIP_FILTER' => '(memberOf=%s)',
// 'AFFECTATION_ORG_UNIT_FILTER' => '(eduPersonOrgUnitDN=%s)',
// 'AFFECTATION_ORG_UNIT_PRIMARY_FILTER' => '(eduPersonPrimaryOrgUnitDN=%s)',
// 'ROLE_FILTER' => '(supannRoleEntite=[role={SUPANN}%s][type={SUPANN}%s][code=%s]*)',
// 'PROF_STRUCTURE' => '(&(eduPersonAffiliation=teacher)(eduPersonOrgUnitDN=%s))',
// 'FILTER_STRUCTURE_DN' => '(%s)',
// 'FILTER_STRUCTURE_CODE_ENTITE' => '(supannCodeEntite=%s)',
// 'FILTER_STRUCTURE_CODE_ENTITE_PARENT' => '(supannCodeEntiteParent=%s)',
],
],
```
Adaptations à faire selon votre contexte :
- Infos de connexion à l'annuaire LDAP **avec un compte admin** pouvant accéder à tous les attributs LDAP :
- `'host'`
- `'username'`
- `'password'`
- Config pour le bind LDAP (vérification identifiant + mot de passe de l'utilisateur) :
- `'baseDn'` : base pour le bind, adaptez à votre annuaire.
- `'bindRequiresDn'`: laisser à `true`.
- `'accountFilterFormat'` : corriger par exemple en `'(&(objectClass=posixAccount)(uid=%s))'` si l'identifiant de
connexion de vos utilisateurs est un "uid".
- Paramètres et filtres de recherche LDAP :
- `'UTILISATEURS_BASE_DN'` : adaptez à votre annuaire, c'est sans doute pareil au `'baseDn'`ci-dessus.
- `'UTILISATEURS_DESACTIVES_BASE_DN'` : mettez la même valeur que pour `'UTILISATEURS_BASE_DN'`.
- `'LOGIN_FILTER'` : corriger par exemple en `'(uid=%s)'` si l'identifiant de
connexion de vos utilisateurs est un "uid".
Authentification via la fédération d'identité Renater (Shibboleth)
==================================================================
> TODO : documenter avec JBP/AH comment installer Shibboleth ? Pfffffffffff
Exemple de configuration dans `config/autoload/xxxx.local.php` :
```php
'unicaen-auth' => [
//...
'shib' => [
/**
* Ordre d'affichage du formulaire de connexion.
*/
'order' => 1,
/**
* Activation ou non de ce mode d'authentification.
*/
'enabled' => true,
/**
* Description facultative de ce mode d'authentification qui apparaîtra sur la page de connexion.
*/
'description' =>
"<p><span class='glyphicon glyphicon-info-sign'></span> Cliquez sur le bouton ci-dessous pour accéder à l'authentification via la fédération d'identité.</p>" .
"<p><strong>Attention !</strong> Si vous possédez à la fois un compte Étudiant et un compte Personnel, vous devrez utiliser " .
"votre compte <em>Étudiant</em> pour vous authentifier...</p>",
/**
* Simulation d'authentification d'un utilisateur.
*/
'simulate' => [
// cf. secret.local.php
],
/**
* Alias éventuels des clés renseignées par Shibboleth dans la variable superglobale $_SERVER
* une fois l'authentification réussie.
*/
'aliases' => [
'eppn' => 'HTTP_EPPN',
'mail' => 'HTTP_MAIL',
'eduPersonPrincipalName' => 'HTTP_EPPN',
'supannRefId' => 'HTTP_SUPANNREFID',
'supannEtuId' => 'HTTP_SUPANNETUID',
'supannEmpId' => 'HTTP_SUPANNEMPID',
'supannCivilite' => 'HTTP_SUPANNCIVILITE',
'displayName' => 'HTTP_DISPLAYNAME',
'sn' => 'HTTP_SN',
'surname' => 'HTTP_SURNAME',
'givenName' => 'HTTP_GIVENNAME',
],
/**
* Clés dont la présence sera requise par l'application dans la variable superglobale $_SERVER
* une fois l'authentification réussie.
*/
'required_attributes' => [
'eppn',
'mail',
'eduPersonPrincipalName',
'displayName',
'sn|surname', // i.e. 'sn' ou 'surname'
'givenName',
'supannRefId|supannEtuId|supannEmpId',
],
/**
* Configuration de la stratégie d'extraction d'un identifiant utile parmi les données d'authentification
* shibboleth.
* Ex: identifiant de l'usager au sein du référentiel établissement, transmis par l'IDP via le supannRefId.
*/
'shib_user_id_extractor' => [
// domaine de l'EPPN (ex: hochonp@unicaen.fr')
'unicaen.fr' => [
'supannEtuId' => [
// nom du 1er attribut recherché
'name' => 'supannEtuId',
// pas de pattern donc valeur brute utilisée
'preg_match_pattern' => null,
],
'supannRefId' => [
// nom du 2e attribut recherché
'name' => 'supannRefId', // ex: '{OCTOPUS:ID}1234;{ISO15693}044D137A7A5E65480'
// pattern éventuel pour extraire la partie intéressante
'preg_match_pattern' => '|\{OCTOPUS:ID\}(\d+)|', // ex: permet d'extraire '1234'
],
/*'supannEmpId' => [
// nom du 3e attribut recherché
'name' => 'supannEmpId',
// pas de pattern donc valeur brute utilisée
],*/
],
/*
// autres domaines
'univ-rouen.fr' => [
'supannEtuId' => ['name' => 'supannEtuId'],
'supannEmpId' => ['name' => 'supannEmpId'],
],
*/
// config de repli pour tous les autres domaines
'default' => [
'supannEtuId' => ['name' => 'supannEtuId'],
'supannEmpId' => ['name' => 'supannEmpId'],
],
],
/**
* URL de déconnexion.
*/
'logout_url' => '/Shibboleth.sso/Logout?return=', // NB: '?return=' semble obligatoire!
],
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment