Wallogit.com
2017 © Pedro Peláez
Role-based Access Control: Roles, Permissions and ACL
Role-based access control solution, extracted from my legacy codebase. It provides a permissions and roles system as well as a simple ACL implementation., (*1)
A client may be associated with certain roles, e.g. Authors or Admins.
These are stored in a RolesStorage object that contains role IDs., (*3)
<?php use \tomkyle\Roles\RolesStorage; $roles = new RolesStorage( 1, 2 ); echo $roles->contains( 2 ) ? "YES" : "NO";
A service may be restricted to certain roles.
AccessControlList as an extension of RolesStorage will do that:, (*4)
<?php
use \tomkyle\Roles\RolesStorage;
use \tomkyle\Roles\RolesAwareInterface;
use \tomkyle\AccessControlList\AccessControlList;
use \tomkyle\AccessControlList\AccessControlListAwareInterface;
class MyUser implements RolesAwareInterface {
use RolesAwareTrait;
}
class MyService implements AccessControlListAwareInterface {
use AccessControlListAwareTrait;
}
$service = new MyService;
$service->setAccessControlList( new AccessControlList( 1, 2) );
$user = new MyUser;
$user->setRoles( new RolesStorage( 2, 3 ) );
echo $service->isAllowed( $user ) ? "YES" : "NO";
A client may be allowed or disallowed to do certain things.
PermissionsStorage will do that:, (*5)
<?php
use \tomkyle\Permissions\PermissionsAwareInterface;
use \tomkyle\Permissions\PermissionsAwareTrait;
use \tomkyle\Permissions\ApplyPermissionsStorage;
class MyUser implements PermissionsAwareInterface {
use PermissionsAwareTrait;
}
$user = new MyUser;
// Reads users permissions from database:
new ApplyPermissionsStorage( $user, $pdo );
echo $user->hasPermission( "my_action" ) ? "YES" : "NO";
This library has no dependencies except a PDO connection. Install from command line or composer.json file:, (*6)
composer require tomykle/rbac
"require": {
"tomkyle/rbac": "dev-master"
}
This package comes with two MySQL dumps, install.sql.dist and install.sample-data.sql.dist. Simply execute their contents; former installs tables, indices and unique constraints, dropping existing tables; latter adds sample data. See comments in table info or field comments., (*7)
The databasa schema uses InnoDB tables for better transaction and relation handling, although currently not using these features (since I never have worked with it yet)., (*8)
Roles, Permissions and their respective associations to clients are stored in a bunch of database tables:, (*9)
| Table | Description |
|---|---|
| tomkyle_roles | Defines all roles (aka user groups) the application works with. |
| tomkyle_permissions | Holds permissions the application works with. |
| tomkyle_permissions_roles_mm | Associates permissions with one or many roles. |
| tomkyle_clients_roles_mm | Associates a client with one or many roles. |
| tomkyle_clients_permissions_adjust | Adjusts a clients' permissions, overriding the ones he is granted or permitted due to his roles |
Sorry, currently there is no administration tool available. I used to manage them manually in the database. Anyhow, unique constraints will prevent you from adding doublettes. So if you have to delete a certain role or permission, do not forget the relation tables that refer to their primary key., (*10)