Blog d'Orditeck

17avr/110

Un système de permission de mon cru

Depuis plusieurs mois déjà, je travaille sur un projet de recherche & développement pour un client. C'est un travail à temps partiel, environ 15 heures par semaine à travers de l'école. Au début, étant sceptique sur la faisabilité de la chose (c'est un projet de recherche & développement hein!) le client était enthousiasme, mais pas assez à mon goût. Cependant, plus les mois avancèrent, plus le client appréciait l'application web.

Il y a de cela un ou deux mois, j'ai eu les premiers signes d'une ouverture plus grande: on voulait éventuellement le rendre accessible à plus d'employés. C'était déjà fait, certes, mais tous avaient le même niveau d'accès. Ou tous n'en avait pas, pour être plus exact. C'est donc dans cette optique que je me suis mis à réfléchir à un système de permission. J'ai bien songé à aller fouiller sur Google pour me diriger, mais ça ne me disait pas. Étant donné que « ça ne pressait pas vraiment » (d'autres trucs à développer urgeaient davantage) j'y pensais tranquillement, disons.

Finalement, j'ai opté pour une forme très souple (enfin, selon moi): des « metakey » qui auront des valeurs (même si ces dernières sont plus ou moins importantes, dépendant des cas). J'ai donné un code à chaque permission, par exemple 0001 => afficher x, 0002 => modifier x, 0003 => supprimer x. Étant donné que le client a plusieurs projets, ça permet également de donner accès à certains projets à certains employés, via la même table. Pour ça, j'ai opté par un suffixe projet_{idProjet} comme metakey.

    public $listeDesPermissions = array(
        '0001' => 'Afficher tous les x',
        '0002' => 'Ajouter un x',
        '0003' => 'Supprimer les x',
        '0004' => 'Éditer les x');

La structure de ma base SQL est la suivante (suivi d'un exemple d'entrées):

 

 

 

 

Finalement, dans une requête SQL qui sélectionnera seulement les projets (par exemple) que l'utilisateur est autorité à afficher, je fais un simple LEFT JOIN:

SELECT champ1, champ2, champ3 FROM projets AS pr
LEFT JOIN permissions AS pe
ON pr.idProjet = SUBSTRING(e.metakey, 8)
WHERE pe.metavalue = '1' AND pe.uid = '$uid'

Le SUBSTRING est présent car mon suffixe projet_{idProjet} fait 7 caractères, je commence donc la lecture au 8ième caractère. La requête ira donc chercher les projets où :
1. l'id du projet est présente en metakey et,
2. la metavalue est à 1 (ce qui veut dire que j'ai affectivement accès) et,
3. l'identifiant du compte est le mien.

Peut-être que ma manière n'est pas la meilleure, je n'ai même pas cherché à comparer. Cependant, elle me permet de faire réellement tout ce dont je peux souhaiter niveau permission. J'aurais de la difficulté à imaginer un système plus simple!