# Gepost op 02-08-2010 18:20
Bewerkt door sebastiaan op 02-08-2010 18:33
Bewerkt door sebastiaan op 02-08-2010 18:33
Ik zit al een tijdje te denken om een ACL (Access Control List) in Webprojects te integreren (samen met Koen). Nu heb ik een heel ruwe basis gemaakt:
En mijn ACL:
Ik heb (helaas) nog niet zoveel verstand van ACL. Kan iemand me wat verder helpen en/of tips geven hoe dit het best in Webprojects in te bakken is?
- <?php
- include('acl.class.php');
- // Een nieuwe instantie van de ACL klasse maken
- $acl = new acl;
- // De resources (acties die een user mag doen) instellen
- $acl->add(new acl_resource('edit'))
- ->add(new acl_resource('delete'))
- ->add(new acl_resource('post'));
- // En de gebruikersrollen instellen.
- $acl->add(new acl_role('lid'))
- ->add(new acl_role('moderator'))
- ->add(new acl_role('administrator'));
- // Een lid mag posten
- $acl->allow('lid', 'post')
- // Een moderator mag alles wat een lid ook mag
- ->extend('moderator', 'lid')
- // Maar een moderator mag ook editen
- ->allow('moderator', 'edit')
- // En de administrator mag ook wat een moderator kan
- ->extend('administrator', 'moderator')
- // En de admin mag ook dingen wissen
- ->allow('administrator', 'delete');
- ?>
En mijn ACL:
- <?php
- /*
- * @author Sebastiaan Franken <sebastiaan@sebastiaanfranken.nl>
- * @version 2.1
- */
- class acl
- {
- public function add($instance)
- {
- if($instance instanceof acl_role)
- {
- return $this->addRole($instance);
- }
- elseif($instance instanceof acl_resource)
- {
- return $this->addResource($instance);
- }
- throw new Exception('Dit is geen geldige instantie om aan acl toe te voegen');
- }
- public function addRole(acl_role $role)
- {
- $this->roles[(string)$role] = $role;
- return $this;
- }
- public function addResource(acl_resource $resource)
- {
- $this->resources[(string)$resource] = $resource;
- return $this;
- }
- private function isInstance($item, $instance)
- {
- if($instance === 'acl_role')
- {
- if($item instanceof acl_role)
- {
- return $item;
- }
- }
- elseif($instance === 'acl_resource')
- {
- if($item instanceof acl_resource)
- {
- return $item;
- }
- }
- else
- {
- throw new Exception('Er is iets fout gegaan in isInstance');
- }
- }
- protected function getRole($role)
- {
- /*
- if($role instanceof acl_role)
- {
- return $role;
- }
- */
- $this->isInstance($role, 'acl_role');
- {
- $role = $this->roles[(string)$role];
- /*
- if($role instanceof acl_role)
- {
- return $role;
- }
- */
- $this->isInstance($role, 'acl_role');
- }
- throw new Exception('Deze rol ('.$role.') bestaat niet');
- }
- protected function getResource($resource)
- {
- /*
- if($resource instanceof acl_resource)
- {
- return $resource;
- }
- */
- $this->isInstance($resource, 'acl_resource');
- {
- $resource = $this->resources[(string)$resource];
- /*
- if($resource instanceof acl_resource)
- {
- return $resource;
- }
- */
- $this->isInstance($resource, 'acl_resource');
- }
- throw new Exception('Deze resource ('.$resource.') bestaat niet');
- }
- protected function getRule(acl_role $role)
- {
- $roleName = (string)$role;
- {
- return $this->rules[$roleName];
- }
- return 0;
- }
- protected function setRule(acl_role $role, $value)
- {
- $roleName = (string)$role;
- $this->rules[$roleName] = $value;
- }
- public function allow($role, $resource)
- {
- $role = $this->getRole($role);
- $resource = $this->getResource($resource);
- $this->setRule($role, $this->getRule($role) | $resource->getBit());
- return $this;
- }
- public function extend($role, $extendRole)
- {
- $role = $this->getRole($role);
- $extendRole = $this->getRole($extendRole):
- $this->setRule($role, $this->getRule($role) | $this->getRule($extendRole));
- return $this;
- }
- public function deny($role, $resource)
- {
- $role = $this->getRole($role);
- $resource = $this->getResource($resource);
- if(!$this->getRule($role) === 0)
- {
- return $this;
- }
- for($i=1;$i<=$length;$i++)
- {
- {
- $allow{$length-$i} = 0;
- }
- }
- return $this;
- }
- public function isAllowed($role, $resource)
- {
- $resource = $this->getResource($resource);
- return (bool)($resource->getBit() & $this->getRule($this->getRole($role)));
- }
- }
- class acl_role
- {
- protected $name;
- public function __construct($name)
- {
- $this->name = $name;
- }
- public function __toString()
- {
- return (string)$this->name;
- }
- }
- class acl_resource
- {
- protected $name;
- protected $bit;
- static public $exp = 0;
- public function __construct($name)
- {
- $this->name = $name;
- }
- public function getBit()
- {
- return (int)$this->bit;
- }
- public function __toString()
- {
- return (string)$this->name;
- }
- }
- ?>
Ik heb (helaas) nog niet zoveel verstand van ACL. Kan iemand me wat verder helpen en/of tips geven hoe dit het best in Webprojects in te bakken is?
Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.