Skip to content

Instantly share code, notes, and snippets.

@silentworks
Created April 11, 2014 15:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save silentworks/10476484 to your computer and use it in GitHub Desktop.
Save silentworks/10476484 to your computer and use it in GitHub Desktop.
<?php
namespace App\Vendor;
use Zend\Permissions\Acl\Acl as ZendAcl;
use Zend\Permissions\Acl\Role\GenericRole as Role;
use Zend\Permissions\Acl\Resource\GenericResource as Resource;
/**
* Class Acl
* @package App\Vendor
*/
class Acl extends ZendAcl
{
public function __construct($container)
{
// App Roles and Role inheritance
$this->addRole(new Role('guest'));
$this->addRole(new Role('standard'), 'guest');
$this->addRole(new Role('administrator'), 'standard');
$this->addRole(new Role('super'));
// App Resources
/** @var \Slim\Slim $container */
$this->createResources($container);
/* App Permissions */
// Guest User Permissions
$this->allow('guest', 'login', ['GET', 'POST']);
$this->allow('guest', 'app', ['GET', 'POST']);
$this->allow('guest', 'auth', ['GET', 'POST']);
$this->allow('guest', 'reset', ['GET']);
// Standard User Permissions
$this->allow('standard', 'dummy.test', ['GET', 'POST']);
$this->allow('standard', 'setting', ['GET', 'POST']);
$this->allow('standard', 'dashboard', ['GET']);
// Administrator User Permissions
$this->allow('administrator', 'user', ['GET', 'POST', 'PUT', 'DELETE']);
$this->deny('administrator', 'setting.admin', ['GET', 'POST', 'PUT', 'DELETE']);
// Allow access to everything
$this->allow('super');
}
private function createResources($container)
{
/** @var \App\Vendor\Router $router */
$router = $container['router'];
/** @var \ArrayIterator $routes */
$routes = $router->getRoutes();
$routes->ksort();
$parentRoutes = [];
foreach ($routes as $key => $route) {
$routeName = $route->getName();
$parentName = null;
array_walk($parentRoutes, function ($currentName, $key) use (&$parentName, $routeName) {
$length = strlen($currentName);
if ($routeName !== $currentName && substr($routeName, 0, $length) === $currentName) {
$parentName = $currentName;
}
});
if (! $this->hasResource($routeName)) {
$this->addResource(new Resource($routeName), $parentName);
}
$parentRoutes[] = $routeName;
}
}
public function isAllowed($roles = null, $resource = null, $privilege = null)
{
if (is_array($roles)) {
// check each of that user's roles
foreach ($roles as $role) {
if (parent::isAllowed($role, $resource, $privilege)) {
return true;
}
}
return false;
} else {
return parent::isAllowed($roles, $resource, $privilege);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment