-
Notifications
You must be signed in to change notification settings - Fork 14
Authentification et permissions
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.
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
Pour vérifier si un utilisateur a le droit de faire quelque chose, il y a plusieurs méthodes en fonction de la situation.
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 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 %}
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
}
}
}
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
.
Sur EtuUTT, il existe trois types d'utilisateurs :
- Les utilisateurs anonymes (non connectés)
- Les utilisateurs classiques (étudiants, membres de l'UTT, exterieurs, etc.)
- Les organisations (associations, clubs et élus).
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 compteUser
-
ROLE_ORGA
: Ce rôle est donné à tout compteOrganization
Une fois que vous savez que votre utilisateur est connecté en tant qu'un utilisateur ou une organisation, vous pouvez accéder à ses informations :
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.