Authentification et droits d'accès

Master Internet, Données et Connaissances

Jean-Marc Lecarpentier

Enseignement des technologies du Web

 

Authentification et droits d'accès

Plan du cours

  • Sessions PHP
  • Authentification par login et mot de passe
  • Gestion des droits sur un site
  • Modèles de droits : ACL, RBAC
  • Singleton vs. Injection de dépendance
  • OpenId, OAuth : authentification via un tiers

Notes de cours

Travail personnel

Authentification des utilisateurs et gestion des droits

En partant de l'architecture du site des poèmes du TP précédent, ajouter le possibilité de se connecter sur le site.

Attention l'exercice n'est pas de gérer les utilisateurs (saisie, etc). On utilisera simplement un tableau PHP pour stocker quelques utilisateurs, par exemple 

<?php
$users 
= array(
    
'jml' => array(
        
'id' => 12,
        
'nom' => 'Lecarpentier',
        
'prenom' => 'Jean-Marc',
        
'mdp' => 'toto',
        
'statut' => 'admin'
    
),
    
'alex' => array(
        
'id' => 5,
        
'nom' => 'Niveau',
        
'prenom' => 'Alexandre',
        
'mdp' => 'toto',
        
'statut' => 'admin'
    
),
    
'julia' => array(
        
'id' => 12,
        
'nom' => 'Dupont',
        
'prenom' => 'Julia',
        
'mdp' => 'toto',
        
'statut' => 'redacteur'
    
)
);
?>

Étapes de réalisation

  • Compléter la classe Request pour que celle-ci gère les données provenant de session et enregistre les données dans $_SESSION.
  • Créer une classe AutenticationManager qui gère la vérification du login/pwd entré par un utilisateur et la mise en session de informations de l'utilisateur connecté. Elle a besoin d'une exception spécifique et d'un afficheur.
  • Compléter le FrontController pour que celui-ci intercepte toute action qui correspond à une connexion (i.e. la présence de données POST de login/mot de passe) et traite alors la demande. On pourra commencer avec un couplage fort en instanciant « en dur », dans le FrontController, la classe AutenticationManager et en la passant en paramètre au constructeur des contrôleurs de classe.
  • Créer une classe AccessManager qui gère les autorisations d'accès. Par exemple, on pourra mettre un ou deux poèmes en accès restreint aux utilisateurs connectés.
  • Améliorer le système pour utiliser un conteneur de services qui sera alors utilisable par tout contrôleur de classe.

Indication complémentaire

La connexion au site se fait en revenant sur la même page, évitant ainsi d'être renvoyé vers une page spécifique, ce qui obligerait ensuite l'utilisateur à revenir à la page initiale. Pour ce faire, le formulaire de connexion doit envoyer vers l'URL utilisé, tout en conservant les variables éventuellement présentes aussi dans l'URL (action demandée par exemple). On peut réaliser cela en utilisant le tableau superglobal $_SERVER, et en particulier $_SERVER['REQUEST_URI'].
Par exemple, si l'URL est http://toto.com/pages/index.php?a=clients&client=jml, alors $_SERVER['REQUEST_URI'] contiendra /pages/index.php?a=clients&client=jml.

Attention : penser à utiliser la classe Request qui encapsule $_SERVER

Connexion sur le site des poèmes via un tiers

En partant de l'architecture du site des poèmes du TP précédent, ajouter le possibilité de se connecter sur le site avec Google (ou autre).

Les indications ci-dessous sont valables pour l'utilisation des services de Google. Les principes seront similaires avec d'autres services tels que Facebook par exemple, mais quelques adaptations seront nécessaires. Pensez à interroger Stackoverflow.

Important : la bibliothèque PHP de Google utilise Guzzle pour gérer les connexions HTTP(S). Le serveur web des pages perso étant placé derrière un proxy, il est nécessaire de spécifier celui-ci pour que les connexions fonctionnent. Pour cela, Guzzle utilise les variables d'environnement, il suffit donc d'ajouter la ligne :

<?php
putenv
('HTTPS_PROXY=https://proxy.unicaen.fr:3128');
?>

Préliminaire : afin de pouvoir utiliser les services de Google, il faut créer un projet afin d'obtenir les clés qui seront ensuite intégrées dans le token JSON. Pour créer le projet, se rendre sur sa console Google : https://console.developers.google.com

Expérimentation

Pour commencer, créer simplement une page qui interroge Google pour obtenir votre email, nom et prénom. On utilisera la bibliothèque google-api-php-client pour réaliser les appels au services de Google.

Intégration dans le site des poèmes

Intégrer dans le site des poèmes la possibilité de se connecter via Google. On considèrera que toute personne qui se connecte par ce moyen possède le statut de "redacteur".

Réfléchir à la façon dont le gestionnaire d'authentification peut être découplé de la méthode d'authentification. On pourra par exemple créer une classe par type de vérification, en commençant par le type login/mot de passe (le système qui existe déjà dans le site) puis en créant celui pour Google, puis etc.