Bonjour,
Je tente de réaliser un système de permissions avancé pour mon portail.
Je suis un peu bloqué sur la structure à adopter.
J'ai créé mon portail à partir de la formation "La POO en PHP".
Toutes les pages de mon portail nécessitent que les utilisateurs soient authentifiés.
Du coup j'utilise la class "DBAuth" pour tous les controlleurs :
AppController.php :
class AppController extends Controller
{
public function __construct()
{
$app = App::getInstance();
$auth= new DBAuth($app->getDb());
if(!$auth->logged())
{
$this->forbidden();
}
}
}
Et dans le constructeur de mes controlleurs :
public function __construct()
{
parent::__construct();
}
Jusque là tout se passe bien.
Tout se compléxifie à partir d'ici. Chaque utilisateur dispose de trois paramètres qui déterminent ce qu'il a le droit de faire / voir sur le portail :
De quel bureau il fait partie :
bureau administratif
bureau cadre
bureau maîtrise 1
bureau maîtrise 2
etc.
De quel équipe il fait partie :
équipe de nuit
équipe préventive
équipe curative
équipe d'intervention
etc.
La qualification de l'utilisateur :
cadre
agent de maîtrise
technicien
etc.
J'ai créé un table SQL qui contient les différentes combinaisons de droits :
Lorsque l'utilisateur se connecte les informations desk + team + qualification sont placées dans la session "Auth".
Je ne veux pas créer une "administration" pour les actions que peuvent effectuer uniquement certains utilisateurs, je souhaite que des boutons ainsi que les menus s'adaptent directement aux possibilités de chaque utilisateur.
Pour être plus clair, voici un exemple :
J'ai deux tables :
La table chantier contient le nom de tous les chantiers.
La table chantier_rapport contient le contenu de chaque intervention sur un chantier.
Les différentes pages de mon portail pour le controller "chantier" sont :
Pour chacune de ces pages les permissions sont différentes.
Par exemple pour les pages :
Je suis preneur des différentes solutions que je peux envisager pour développer ce système de permission.
J'étais parti pour créer une table qui contient toutes les restrictions pour chaque méthode d'un controlleur mais au final c'est imbitable.
Salut,
Comme tu as développé ton code à partir de la formation "La POO en PHP",
une idée serait de te créer une fonction, disons "accessOnly()" (hérité depuis une class Controller générique), que tu mettrai au début de CHAQUE action :
class MonController extends Controller
{
...
public function monAction1()
{
$this->accessOnly('MAIT1', 'NUIT', 'TECH');
...
}
public function monAction2()
{
$this->accessOnly('MAIT2', 'NUIT', 'TECH');
...
}
...
}
Dans ta fonction accessOnly(), tu vérifies si l'utilisateur connecté, à les "access" correspondant, sinon tu redirige avec peut-être un petit message.
class Controller
{
...
public function accessOnly($desk, $team, $qualification)
{
// tu vérifie que les "droits" passés en paramètres correspondent aux droits de l'utilisateurs connecté
if ( OK )
{
// NOTHING
// on laisse passer, et l'action du controller qui a été appelée à l'origine, pourra s'exécuter normalement
}
else
{
// un petit message qu'on affichera
$_SESSION['flash'] = 'Désolé, vous n\'avez pas accès à cette page.';
// redirection
header('Location: index.php');
exit(0); // il me semble qu'il faut mettre un exit(0) ici, je ne suis pas sûr.
}
}
...
}
La fonction accessOnly() sera là au DÉBUT de CHAQUE action pour rediriger l'utilisateur s'il n'as pas le droit d'exécuter l'action.
Si un controller entier n'a QUE des actions réservées aux "techniciens" par exemple, tu peux carrément mettre la fonction accessOnly() dans le constructeur du Controller :
class MonController extends Controller
{
...
public function __construct()
{
...
// si on choisit de mettre des "null" ou des "''", ou je sais pas quoi, il faudra coder accessOnly() en conséquence.
accessOnly(null, null, 'TECH');
...
}
// Du coup, peu importe l'action qu'on appel (dans ce controller), si l'utilisateur n'est PAS un TECH, il sera redirigé.
...
}
Tu risque d'avoir un problème :
S'il faut donner l'accès aux 'MAIT1' ET aux 'MAIT2', on est un peu bloqué.
Une solution serait d'envoyer 3 tableaux, plutôt que 3 strings
public function accessOnly(array $desk, array $team, array $qualification)
{
...
}
accessOnly(['MAIT1', 'MAIT2'], ['NUIT'], ['TECH']);
Quand tu auras fini avec ça, il faudra travailler un peu le système de redirection, parce-que là on redirige tout le temps tout le monde sur index.php, ce n'est pas terrible.
Mais ça, ce sera un autre boulot ^^
La solution me semble pas mal, je vais partir sur l'utilisation des tableaux pour chacun des paramètres.
J'utilise les messages flash en cas d'erreur, je vais partir dessus au lieu de rediriger sur la page d'accueil.
Je partage mon code dès que j'avance sur le développement.
Merci pour la piste.
Yep, j'ai passé le topic en résolu.
Je reviendrai dessus si je bloque pendant le développement.