
Cours Laravel 8 – la sécurité – les équipes
Dans cet article on va finir l’exploration des possibilités de Jetstream. On a déjà vu précédemment qu’on dispose avec ce package de tout l’arsenal de l’authentification (connexion, déconnexion, oubli du mot de passe, vérification de l’email, vérification du mot de passe…). On a vu également que l’utilisateur dispose d’une gestion complète de son profil (informations personnelles, changement du mot de passe, authentification à double facteur, purge de session…). On va voir dans cet article que Jetstream offre aussi la possibilité de gérer des équipes (teams) avec des permissions.
Installation
Pour l’installation on retrouve exactement ce qu’on a vu. En partant d’un Laravel 8 tout neuf on installe Jetstream :
composer require laravel/jetstream
Mais ensuite dans la mise en route de jetstream on ajoute une option :
php artisan jetstream:install livewire --teams
Et enfin on génère les assets et les tables de la base de données :
npm install npm run dev php artisan migrate
On voit apparaître deux tables nouvelles :
Ces tables correspondent à la gestion des équipes (teams). On a la table pour enregistrer les équipes (teams) et la table pivot pour la relation n:n avec les utilisateurs (team_user).
Quand un utilisateur s’enregistre on va trouver un menu enrichi dans son dashboard :
En plus du profil et de la gestion des tokens d’APi dont j’ai parlé dans le précédent article, on trouve des liens pour la gestion des équipes. Par défaut un utilisateur dispose au départ d’une équipe personnelle, ici Durand’s Team. On la retrouve dans la table teams :
L’utilisateur (avec l’item Team Settings du menu) peut gérer complètement les équipes :
On voit ici qu’il peut modifier le nom de son équipe personnelle et qu’il peut gérer les membres.
Gérer les équipes
On peut créer une nouvelle équipe avec l’item Create New Team du menu, on arrive alors sur ce formulaire :
Là on demande juste un nom. Lorsque la nouvelle équipe est créée on la retrouve dans le menu :
Là avec un clic on peut passer d’une équipe à une autre :
C’est l’équipe active à un moment donné.
On peut aussi supprimer une équipe :
Gestion des membres
On peut ajouter un membre à une équipe à partir de ce formulaire :
On renseigne l’email qui doit évidemment correspondre à celui d’un utilisateur déjà enregistré dans la base. On spécifie aussi son rôle, on voit qu’on à le choix entre deux rôles.
Une fois que le membre est effectivement ajouté il apparaît dans la liste des membres :
On peut modifier le rôle en utilisant le lien, ici Editor :
Les rôles et permissions
On a vu ci-dessus qu’on dispose de deux rôles (Administrator et Editor), mais comment en ajouter ou les modifier ? De plus quelles sont les permissions associées et comment changer ça ? On ne trouve rien au niveau de l’interface alors il faut aller piocher dans le code…
On trouve tout ça dans le provider JetstreamServiceProvider :
protected function configurePermissions() { Jetstream::defaultApiTokenPermissions(['read']); Jetstream::role('admin', 'Administrator', [ 'create', 'read', 'update', 'delete', ])->description('Administrator users can perform any action.'); Jetstream::role('editor', 'Editor', [ 'read', 'create', 'update', ])->description('Editor users have the ability to read, create, and update.'); }
On peut donc facilement jouer sur les rôles et permissions :
Jetstream::role('writer', 'Author', [ 'create', 'update', ])->description('Author users have the ability to create, and update.');
Les autorisations et l’équipe active
C’est bien de prévoir des permissions mais encore faut-il pouvoir les utiliser…
Jetstream ajoute un trait dans le modèle User :
use Laravel\Jetstream\HasTeams; ... class User extends Authenticatable { use HasTeams;
Dans ce trait on trouve la méthode hasTeamPermission qui va permettre de vérifier ces permissions sur les requêtes entrantes :
if ($request->user()->hasTeamPermission($team, 'update')) { // Ici on fait quelque chose si l'utilisateur a le droit de le faire }
Je n’ai pas encore parlé des autorisations dans ce cours, pour ceux qui sont pressés la documentation est ici.
Mais le trait ajouté ne se limite évidemment pas aux permissions. On peut aussi connaître l’équipe active de l’utilisateur :
$user->currentTeam
On peut obtenir des tas d’autres renseignements dont vous avez le détail dans la documentation.
Conclusion
Jetstream offre une gestion des rôles et permissions au travers de la notion d’équipes (teams), ce qu’on appelle en général groupes dans d’autres librairies. On peut donc se passer de package supplémentaire pour accomplir des actions de gestion des rôles et permissions, ce que l’on faisait généralement avant Laravel 8.


9 commentaires
DIM
Salut Best j’ai une appli et j’aimerai accéder au nom de l’équipe de l’utilisateur actuel , comment puise-je faire ça ,en fait l’objectif est de ne permettre l’accès de certaines fonctionnalités à des membres s’une certaine équipe
Merci
bestmomo
Salut,
Tu as pas mal de méthodes disponibles qui sont documentées ici.
fabBlab
Concernant : « On renseigne l’email qui doit évidemment correspondre à celui d’un utilisateur déjà enregistré dans la base. »
De nouveau, la procédure a sans doute changé, car on peut saisir l’email d’un utilisateur non encore enregistré.
Dans un cas, comme dans l’autre, la personne reçoit un mail avec des liens pour accepter la demande.
C’est le comportement auquel on s’attend dans ce type de procédure, donc c’est une amélioration.
nasser
Rien de méchant le soucis ne viens pas du charset mais de la string qui est passer en attribut (value) a
a changer en $slot et sa fonctionne parfaitement
{{ __(‘Team Name’) }}
GrCOTE7
Notons que pour traduire les rôles, il suffit de renseigner le fichier des traductions:
https://prnt.sc/vkuevh
😉
GrCOTE7
Fixed by Serge Ledig sur le dépôt Gist 🙂 :
https://prnt.sc/vktzc2
🙂
GrCOTE7
Ok… Je pense ça vient de Jetstream … G posé observation ds le dépot Gist de ce fichier de traduction, et g tt de même posé même observation au responsable de ce dépôt…
Et sinon, faudra voir avec Jetstream, sinon, globalement, sacrée mécanique hyper cool 🙂 !
@++
GrCOTE7
Bonjour, BestMomo,
Superbe série comme d’hab (J’me demande même si elle est pas encore et toujours de meilleure monture… 🙂 …
En complément de ce guide, j’ai cherché à obtenir tous les messages en FR (Pour les tokens, les Teams, etc…)…
Grâce à ce dépôt, ça marche globalement très bien:
https://gist.github.com/cotiga/786b73f794c24e0d26daf8531338bfce
Cependant, malgré que le charset de la page est correcte, en UTF-8, j’obtiens une erreur d’affichage pour les apostrophes pour la partie Team, uniquement dans un bloc :
https://prnt.sc/vk44vs
Je comprends bien que cela sort un peu du cadre du présent tuto, mais si tu as une idée de piste pour soluce cela, j’ch’ui preneur 😉 !
@++
bestmomo
Salut,
C’est curieux que ça le fasse que pour cette page… A priori je vois pas l’origine…