SAND-framework/console/skel/symfony-app/src/Session/AuthBundle/README.md
Emmanuel ROY 74cda2657a Modification gitignore
TODO: créé les pages de blog (sommaire,news) permettant d'afficher les fichiers md
2020-04-01 14:44:36 +02:00

9.9 KiB

AuthBundle

Configuration minimale requise

Le bundle est compatible à partir de la version 3.4 de Symfony.

Installation

Installation via composer (recommandé)

Dans un premier temps renseigner le "repository" via la commande :

composer config repositories.authbundle git "ssh://git@gitlab1.in.ac-besancon.fr:1232/abelhadjali/authbundle.git"

Ceci va ajouter dans votre fichier composer.json les lignes suivantes

   ... 
   "repositories": {
        "authbundle": {
            "type": "git",
            "url": "ssh://git@gitlab1.in.ac-besancon.fr:1232/abelhadjali/authbundle.git"
        }
    }
  ...

Puis ajouter la dépendance au bundle en précisant le tag de la version souhaitée ici à partir de la v0.1

composer require ac-besancon/authbundle:^0.1

Enfin activer le bundle en suivant les instructions de la section AuthBundle#Activation du bundle

Installation sans composer

Récupérer les sources

Copier et coller le dossier Besancon du Bundle dans le repertoire src/ de votre projet Symfony.

Déclaration du namespace

Dans le fichier composer.json et dans la section "autoload" de votre projet ajouter:

       "autoload": {
        "psr-4": {
            ...
            "Besancon\\AuthBundle\\": "src/Besancon/AuthBundle",
            ...
        }

Puis executer la commande composer suivante :

composer dump-autoload

Activation du bundle

Pour activer le Bundle, ouvrir le fichier app/AppKernel.php et y ajouter:


// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Besancon\AuthBundle\BesanconAuthBundle(),
        );

        // ...
    }

    // ...
}

Configuration

======================

Liste complète des options de configuration

La configuration est à déclaré dans le fichier app/config/config.yml du projet Symfony.

besancon_auth:
    #Activation du user_provider interne
    #par défaut TRUE
    use_default_provider : true
    #Namespace de l'entité utilisateur
    #L'entité doit implémenter Symfony\Component\Security\Core\User\UserInterface
    #par défaut est utilise Besancon\AuthBundle\Security\User\AuthUser 
    user_entity: Mon\Entite\User
    #nom de la route correspondant à la page d'accueil de l'application
    #par défaut est à NULL
    homepage: "homepage"
    #tag du service personnalisé permettant de gérer l'authentification
    #par défaut est à bes_auth.authentification (service par défaut)
    authentication_service: mon_service.authentification
    #Mode d'authentification Cas ou Rsa
    #obligatoire pas de valeur par défaut
    type_auth: Cas
    #Configuration pour le mode Cas
    #obligatoire si mode Cas choisi
    cas:
        #Serveur Cas
        hostname: "seshat23.ac-besancon.fr"
        #Port Cas
        port: 8443
        #Uri Cas
        uri: ""
    #Configuration pour le mode Rsa
    #obligatoire si mode Rsa choisi
    rsa :
        #Url de déconnexion Rsa
        logout_url: http://url.deconnexion.fr/login/ct_logout.jsp

Configuration dans le firewall

Ouvrir le fichier app/config/security.yml du projet Symfony.

Si utilisation du user provider interne bes_auth.user_provider , alors le déclarer dans la section providers :

...
providers:
        app:
           id: bes_auth.user_provider
...

Sinon préciser votre propre user provider

Toujours dans le même fichier, dans la section des firewalls, déclarer le guard bes_auth.authenticator dans la zone à sécurisée :

    firewalls:
     ...
        secured_area:
            logout_on_user_change: true
            ...
            guard:
                authenticators:
                    - bes_auth.authenticator 
            logout:
                path:   auth_cas_logout #nom de la route de déconnexion
                target: /
                success_handler: bes_auth.authenticator
            ...

Plus d'infos sur le user provider :

Il est donc important de définir la route de déconnexion dans le fichier app/config/route.yml

...

auth_cas_logout:
   path: /logout

...

Configuration avancée

Création d'un service d'authentification

Pour cela, créer un service qui hérite de AuthAbstract et implémente AuthInterface


<?php

namespace AppBundle\Security\Auth;

use Besancon\AuthBundle\Security\Interfaces\AuthInterface;
use Doctrine\ORM\EntityManager;
use Besancon\AuthBundle\Security\Abstracts\AuthAbstract;

class MonService extends AuthAbstract implements AuthInterface {
...
}

Il faut ensuite implémenter les méthodes suivantes :


    /**
     * Contrôle de l'accès à partir des attributs CAS ou RSA
     * 
     * Vérifier les droits d'accès à l'application à partir des attributs récupérées des getters :
     *      - CasAttributes
     *      - RsaAttributes 
     * 
     * @param UserInterface $user
     *      L'entité user récupéré par le provider
     * 
     * @return bool
     *      - true si accès autorisé
     *      - false si accès refusé
     */
    public function ctrlAccess(UserInterface $user);

    /**
     * Calcule et retoune le(s) rôle(s) à partir des attributs CAS ou RSA
     * 
     * Calculer le(s) rôle(s) à partir des attributs récupérées des getters :
     *      - CasAttributes
     *      - RsaAttributes 
     * Doit retourner un tableau même vide 
     * 
     * @return array
     */
    public function getRoles();

    /**
     * Retourne un utilisateur pour la génération du token, si l'utilisateur n'existe pas en base de donnée
     * 
     * ATTENTION :  CETTE METHODE DOIT ÊTRE REDEFINIE SI UTILISATION D'UNE ENTITE UTILISTEUR 
     * DIFFERENTE DE CELLE UTILISEE PAR DEFAUT
     * 
     * @param String $username
     *      uid de l'utilisateur récupéré de Cas ou Rsa
     * 
     * @return UserInterface
     */
    public function getUser($username);

    /**
     * Traitement personnalisé après récupération du token
     * 
     * Il est possible d'enrichir le token (attributs...) ou d'effectuer des contrôles supplémentaire
     * 
     * @param $token 
     *      Token d'authification généré
     * 
     * @return null
     */
    public function onSuccess($token);

    /**
     * Traitement personnalisé lorsque la connexion n'a pas abouti
     * 
     * Vérifié l'exception généré et adapter l'action (redirection, déconnexion...)
     * 
     * Doit retourner un objet de type Response 
     * 
     * Exemple :
     * 
    * ```  
    *   public function onAuthenticationFailure(\Symfony\Component\Security\Core\Exception\AuthenticationException $exception) 
    *   {
    *        $content = $this->twig->render(
    *           '@App/Test/forbiden.html.twig', array()
    *        );
    *        $response = new Response($content, Response::HTTP_FORBIDDEN);
    *        return $response;
    *   }
    * ```
    *
    * @param AuthenticationException $exception 
    *      Exception générée par le provider
    * 
    * @return Symfony\Component\HttpFoundation\Response
    *
    */
    public function onAuthenticationFailure(\Symfony\Component\Security\Core\Exception\AuthenticationException $exception);

Enfin lorsque le service est prêt, le déclarer, en le reliant à la classe parent Besancon\AuthBundle\Security\Abstracts\AuthAbstract:


    mon_service.authentification:
       class: AppBundle\Security\Auth\MonService 
       parent: Besancon\AuthBundle\Security\Abstracts\AuthAbstract
       public: false  

#OU si version Symfony >=3.4

    AppBundle\Security\Auth\MonService:
        autowire: true
        parent: Besancon\AuthBundle\Security\Abstracts\AuthAbstract
        public: false  
        autoconfigure: false

Puis déclarer dans la configuration (AuthBundle#Liste complète des options de configuration) du bundle le nom du service personnalisé :

besancon_auth:
...
    authentication_service:  mon_service.authentification

#OU si version Symfony >=3.4

    authentication_service:  AppBundle\Security\Auth\MonService

 ...

Personnaliser la page en cas d'échec d'authentification

En cas d'échec lors de l'authentification (exemple ctrlAccess() retourne false) , par défaut, le bundle renvoie une page blanche avec le message renvoyé par l'exception qui a généré l'erreur. Afin de personnaliser cette page, il faut passer par la création d'un service comme indiqué dans le paragraphe AuthBundle#Création d'un service d'authentification et de redéfinir la méthode onAuthenticationFailure.

Voici un exemple :


class MonService extends AuthAbstract implements AuthInterface
{

    
    public function __construct(Twig_Environment $twig)
    {
        $this->twig = $twig;
    }

    ...

    public function onAuthenticationFailure(\Symfony\Component\Security\Core\Exception\AuthenticationException $exception)
    {

        $content = $this->twig->render(
            '@App/Test/forbiden.html.twig', array()
        );
        $response = new Response($content, Response::HTTP_FORBIDDEN);
        return $response;
    }
}

Nous pouvons remarquer que dans cet exemple, le service prend en paramètre dans le constructeur $twig qui est l'instance de Twig de notre applciation. Pour que cela fonctionne, il faut auparavant avoir passer le tag twig à notre service :

 ...
 AppBundle\Security\Auth\MonService:
        autowire: true
        parent: Besancon\AuthBundle\Security\Abstracts\AuthAbstract
        public: false  
        autoconfigure: false
        arguments: ['@twig']
 ...

Ainsi lorsqu'une personne tentera de se connecter et qu'il n'aura, par exemple, pas les droits nécessaires le template @App/Test/forbiden.html.twig sera chargé.