Skip to content

Authentification et permissions

Aurélien Labate edited this page Apr 24, 2016 · 10 revisions

Tout le système d'identification d'EtuUTT utilise le composant Security de Symfony. On utilise donc le système de roles.

Un Rôle est tout simplement une permission ou un groupe de permissions. L'avantage de ces rôles, c'est qu'on peut faire en sorte qu'un role en implique un autre, et c'est modifiable très facilement.

Sur EtuUTT nous avons choisis de faire trois types de rôles :

  • Les groupes de permissions : Administrateur, modérateur, etc.
  • Les droits élémentaires : le droit de voir les photos d'argentique, le droit de les administrer, etc.
  • Les rôles automatiques : Il sont générés automatiquement en fonction du type de compte.

Dans le code, on ne vérifiera donc que les droits élémentaires et parfois les rôles automatiques. Si vous ajoutez une nouvelle fonctionnalité, il suffira d'ajouter un nouveau rôle élémentaire.

Attribuer un groupe de permission à un membre

Vous devez disposer du droit élémentaire ROLE_CORE_ADMIN_ROLES pour faire cela (il est donné par ROLE_ADMIN).

Rendez vous sur le profil du compte que vous souhaitez modifier. (en le recherchant sur le trombi par exemple). Puis cliquez sur le bouton Modifier ses permissions. Sur cette page vous pourrez attribuer des groupes de permissions en cochant les cases, ou voir les droits élémentaires associés en cliquant sur les nom de groupes.

Vous pouvez aussi passer par la console pour sela avec les commandes etu:users:set-admin et etu:users:grant

Vérifier les rôles de l'utilisateur dans le code

Pour vérifier si un utilisateur a le droit de faire quelque chose, il y a plusieurs méthodes en fonction de la situation.

Dans un contrôleur

Pour tester si l'utilisateur connecté dispose d'un droit :

// Qui a le drooooit ?
if ($this->isGranted('ROLE_XXXXX')) {
    // Oui !
}

Sinon, si votre but est d'interdire totalement l'accès et de

  • Rediriger vers la page de connexion si l'utilisateur n'est pas connecté
  • Renvoyer à la page d'accueil avec un message d'erreur si l'utilisateur est connecté mais n'a pas le droit

Alors la fonction suivante est faite pour vous, et elle fait tout en une ligne 👍

$this->denyAccessUnlessGranted('ROLE_XXXX'));

Dans un template

Dans un template twig, encore une fois, c'est très simple, il vous suffit de faire

{% if is_granted('ROLE_XXXX') %}
   Oui ! Tu as le droit de XXXX !
{% endif %}

Dans un service

La ça se complique ! Dans le fichier où vous avez enregistré votre service (service.yml), ajoutez le parametre @security.authorization_checker. Pour que ça ressemble à un truc comme ça :

services:
    exemple_manager:
        class:     AppBundle\Exemple\ExempleManager
        arguments: ['@security.authorization_checker']

Ensuite dans le fichier de classe de votre service, ajoutez un attribut pour stocker AutorizationChecker et enregistré le au moment de la construction de l'objet.

Vous pourrez ensuite accéder à $this->authorizationChecker->isGranted pour vérifier les permissions.

namespace AppBundle\Example;

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class ExampleManager
{
    protected $authorizationChecker;

    public function __construct(AuthorizationCheckerInterface $authorizationChecker)
    {
        $this->authorizationChecker = $authorizationChecker;
    }

    public function arbeit()
    {
        if ($this->authorizationChecker->isGranted('ROLE_NEWSLETTER_ADMIN')) {
            // oui
        }
    }
}

Voir et modifier la hiérarchie des rôles

Pour voir la hiérarchie des rôles, rendez-vous sur EtuUTT. Sur admin/users/permissions, en bas de la page, vous pouvez voir la hiérarchie des rôles. Cette hiérarchie montre quel groupe de permission implique quels rôles élémentaires.

Pour modifier la hiérarchie des rôles, il faut modifier app/config/security.yml.

Notez que tout rôle créé doit commencer par ROLE_ sinon il ne sera pas valide. (imposé par symfony)

Si vous souhaitez ajouter un nouveau rôle (que ce soit un groupe de permission ou un droit élémentaire), alors il vous suffit de l'ajouter au fichier app/config/security.yml. Puis ajouter sa description dans src/Etu/Core/UserBundle/Resources/translations/messages.fr.yml à la catégorie user.admin.userRoles.

Récupération les infos de l'utilisateur courant

Sur EtuUTT, il existe trois types d'utilisateurs :

Cette différence est très importante, car bien que ce sont tous des utilisateurs, et que pour les deux derniers, on accèdera à l'objet qui les représente de la même façon, l'objet ne comporte pas du tout les mêmes champs (il n'est pas stocké dans la même table de la BDD) et on ne peut donc pas les traiter de la même façon.

Il existes 3 roles automatiques concernant les types de comptes:

  • IS_AUTHENTICATED_FULLY : Ce rôle spécial, permet de savoir si le visiteur n'est pas anonyme.
  • ROLE_USER : Ce rôle est donné à tout compte User
  • ROLE_ORGA : Ce rôle est donné à tout compte Organization

Une fois que vous savez que votre utilisateur est connecté en tant qu'un utilisateur ou une organisation, vous pouvez accéder à ses informations :

Dans un contrôleur

Dans un template

Dans un service

L'authentification

Normalement, vous n'aurez pas vraiment besoin de savoir comment fonctionne l'authentification si vous ne la modifiez pas. Néanmoins, je vais quand même la documenter pour pouvoir faciliter les futur modifications.