26
NOV

Lock - Une bibliothèque de gestion d'ACL pour PHP 5.4+

Publié le 26/11/14 à 09h06 par DJo

Lock est une bibliothèque PHP 5.4+ permettant de mettre en place un système d'ACL flexible pour vos applications web.

Lock est une bibliothèque PHP 5.4+ permettant de mettre en place un système d'ACL flexible pour vos applications web.

Aujourd'hui, tous les frameworks PHP modernes embarquent un système de rôles et d'ACL pour personnaliser au mieux les droits sur chaque action et ressource. Toutefois, ces systèmes peuvent s'avérer assez complexes à mettre en place et sont finalement assez peu utilisés.

Lock est une bonne alternative aux systèmes d'ACL PHP. La bibliothèque propose une gestion fine des droits et peut s'implémenter dans n'importe quel framework ou CMS maison PHP 5.4+.

Il embarque des fonctionnalités d'ACL plutôt classiques:

  • Définition de classes caller (Classes des utilisateurs)
  • Attribution d'ACL pour différentes entités
  • Stockage des permissions en statique ou via des drivers
  • Gestion d'alias pour les actions
  • Gestion de rôles et de groupes de rôles
  • Système de conditions / assert
  • Implémentation facilité des ACL avec des traits

Côté mise en place, voici quelques exemples. Dans un premier temps, il faut étendre les classes callers et spécifier les méthodes liées:

<?php
use BeatSwitchLockContractsCaller;
class User implements Caller
{
    public function getCallerType()
    {
        return 'users';
    }
    public function getCallerId()
    {
        return $this->id;
    }
    public function getCallerRoles()
    {
        return ['editor', 'publisher'];
    }
}

Ensuite, on défini les droits du caller en statique avec ArrayDriver ou avec un autre driver spécifique:

use BeatSwitchLockDriversArrayDriver;
use BeatSwitchLockLock;

// Instantiate the Lock instance with the static ArrayDriver.
$lock = new Lock($caller, new ArrayDriver());

// Set some permissions.
$lock->allow('manage_settings');
$lock->allow('create', 'events');

Notre classe User représentée dans la variable $caller dispose des droits de gestion des paramètres et peut créer des events. On peut vérifier ces droits à l'aide des méthodes d'assert:

// Use the Lock instance to validate permissions on the given caller.
$lock->can('manage_settings'); // true: can manage settings
$lock->can('create', 'events'); // true: can create events
$lock->cannot('update', 'events'); // true: cannot update events
$lock->can('delete', 'events'); // false: cannot delete events

Il est possible d'aller plus loin dans les droits en spécifiant les ACL sur des ressources:

$lock->allow('edit', 'posts');
$lock->deny('edit', 'posts', 5);
$lock->can('edit', 'posts'); // true
$lock->can('edit', 'posts', 5); // false

Dans cet exemple, il sera possible de restreindre la modification du post d'ID 5 à l'utilisateur.

Un système d'alias permet de regrouper en une action plusieurs actions:

$lock->alias('manage', ['create', 'read', 'delete']);
$lock->allow('manage', 'posts');
$lock->can('manage', 'posts'); // true
$lock->can('create', 'posts'); // true
$lock->can('delete', 'posts', 1); // true
$lock->can('update', 'posts'); // false

Et on retrouve la même chose pour le système de rôles, voici quelques exemples d'ACL par rôles:

$lock->setRole(['editor', 'admin'], 'user'); // Les rôles editor et admin obtiennent les droits du rôle user

// Allow a guest to read everything.
$lock->allowRole('guest', 'read');

// Allow a user to create posts.
$lock->allowRole('user', 'create', 'posts');

// Allow an editor and admin to publish posts.
$lock->allowRole(['editor', 'admin'], 'publish', 'posts');

// Allow an admin to delete posts.
$lock->allowRole('admin', 'delete', 'posts');

// Let's assume our caller has the role of "editor" and check some permissions.
$lock->can('read'); // true
$lock->can('delete', 'posts'); // false
$lock->can('publish'); // false: we can't publish everything, just posts.
$lock->can(['create', 'publish'], 'posts'); // true

La bibliothèque PHP est encore en phase alpha, mais est déjà fonctionnelle.

Plusieurs drivers sont prévus pour s'interfacer facilement avec les frameworks PHP du marché.

A installer en une ligne de commande via composer dans vos projets PHP.

 

Site Officiel

Baraguiné par xdubois le 26/11/14 à 22h40
xdubois via Twitter
Petite correction : Il faut implémenter l'interface caller et non l'étendre.

Ajouter un Commentaire

Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:

Compte la Ferme du Web

Identifiez-vous
Inscrivez-vous

Compte Facebook

Connexion avec Facebook

Compte Twitter

Connexion avec votre compte twitter
Rechercher sur la Ferme du web