J'ai du mal à mettre en œuvre un contrôle d'accès pour un cadre personnalisé.
La granularité RBAC n'est pas nécessaire, j'ai donc décidé d'utiliser une sorte d'ACL où les ressources seront actions du contrôleur.
Voici la structure de la base de données :
utilisateurs :
- John
- Mary
- Greg
groupes_utilisateurs :
- Administrateurs
- Comptables
- Managers
utilisateurs_à_groupes_d'utilisateurs :
- John => Administrateurs
- Mary => Comptables
- Greg => Managers
ressources (actions du contrôleur) :
- utilisateurs/edit
- factures/addition
- clients/suppression
ressources_vers_les_groupes_d'utilisateurs :
- users/edit => Administrateurs
- factures/ajouts => Comptables
- customers/delete => Managers
Et voici le [pseudo]code.
$user = new User; // This will be currently logged in user ...
$acl = new Acl($user);
$dispatcher = new Dispatcher($acl);
$dispatcher->dispatch('users', 'new');
class Dispatcher
{
public function dispatch($controller, $action)
{
$permission = $controller . '/' . $action;
if(!$this->acl->isAllowed($permission))
{
throw new AccessDeniedException("Access denied");
}
// User is authorized to execute this action, dispatch ...
}
}
J'ai aimé cette approche... jusqu'à ce que je réalise qu'il y a aussi beaucoup de requêtes XHR.
Par exemple, la liste des factures utilise une requête XHR pour obtenir le montant total, la liste des commandes utilise des requêtes XHR. pour charger les positions des commandes et d'autres données, etc.
Il doit donc y avoir un regroupement des ressources, par exemple, une nouvelle table resource_groups :
- Liste des factures (factures/liste, factures/xhr_get_total_amount)
- Liste des commandes (commandes/list, commandes/xhr_get_positons_for_order, commandes/xhr_get_some_other_data)
- Ajouter un nouvel utilisateur (users/new) # Action unique, le formulaire d'entrée d'un nouvel utilisateur n'utilise pas de requêtes XHR
... et au lieu d'affecter des ressources à des groupes d'utilisateurs, affectez des groupes de ressources à des groupes d'utilisateurs.
Ça semble si compliqué. Est-ce la bonne façon de procéder ? Que peut-on améliorer ? Est-ce qu'un cadre quelconque aborde ce problème ?