U bevindt zich hier: Forum » WebProjects support forum » Webprojects ACL ?
   Actief Topic: Webprojects ACL ?

Vorige ( 1 ) Volgende

sebastiaan
member
avatar
# Gepost op 02-08-2010 18:20
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:
Plain | Plain new window | PHP code:
  1.  
  2. <?php
  3. include('acl.class.php');
  4. // Een nieuwe instantie van de ACL klasse maken
  5. $acl = new acl;
  6.  
  7. // De resources (acties die een user mag doen) instellen
  8. $acl->add(new acl_resource('edit'))
  9.     ->add(new acl_resource('delete'))
  10.     ->add(new acl_resource('post'));
  11.    
  12. // En de gebruikersrollen instellen.
  13. $acl->add(new acl_role('lid'))
  14.     ->add(new acl_role('moderator'))
  15.     ->add(new acl_role('administrator'));
  16.    
  17. // Een lid mag posten
  18. $acl->allow('lid', 'post')
  19.     // Een moderator mag alles wat een lid ook mag
  20.     ->extend('moderator', 'lid')
  21.     // Maar een moderator mag ook editen
  22.     ->allow('moderator', 'edit')
  23.     // En de administrator mag ook wat een moderator kan
  24.     ->extend('administrator', 'moderator')
  25.     // En de admin mag ook dingen wissen
  26.     ->allow('administrator', 'delete');
  27. ?>
  28.  


En mijn ACL:
Plain | Plain new window | PHP code:
  1.  
  2. <?php
  3. /*
  4.  * @author Sebastiaan Franken <sebastiaan@sebastiaanfranken.nl>
  5.  * @version 2.1
  6.  */
  7. class acl
  8. {
  9.     protected $roles = array();
  10.     protected $resources = array();
  11.     protected $rules = array();
  12.    
  13.     public function add($instance)
  14.     {
  15.         if($instance instanceof acl_role)
  16.         {
  17.             return $this->addRole($instance);
  18.         }
  19.         elseif($instance instanceof acl_resource)
  20.         {
  21.             return $this->addResource($instance);
  22.         }
  23.        
  24.         throw new Exception('Dit is geen geldige instantie om aan acl toe te voegen');
  25.     }
  26.    
  27.     public function addRole(acl_role $role)
  28.     {
  29.         $this->roles[(string)$role] = $role;
  30.         return $this;
  31.     }
  32.    
  33.     public function addResource(acl_resource $resource)
  34.     {
  35.         $this->resources[(string)$resource] = $resource;
  36.         return $this;
  37.     }
  38.    
  39.     private function isInstance($item, $instance)
  40.     {
  41.         if($instance === 'acl_role')
  42.         {
  43.             if($item instanceof acl_role)
  44.             {
  45.                 return $item;
  46.             }
  47.         }
  48.         elseif($instance === 'acl_resource')
  49.         {
  50.             if($item instanceof acl_resource)
  51.             {
  52.                 return $item;
  53.             }
  54.         }
  55.         else
  56.         {
  57.             throw new Exception('Er is iets fout gegaan in isInstance');
  58.         }
  59.     }
  60.    
  61.     protected function getRole($role)
  62.     {
  63.         /*
  64.         if($role instanceof acl_role)
  65.         {
  66.             return $role;
  67.         }
  68.         */
  69.         $this->isInstance($role, 'acl_role');
  70.        
  71.         if(isset($this->roles[(string)$role]))
  72.         {
  73.             $role = $this->roles[(string)$role];
  74.            
  75.             /*
  76.             if($role instanceof acl_role)
  77.             {
  78.                 return $role;
  79.             }
  80.             */
  81.             $this->isInstance($role, 'acl_role');
  82.         }
  83.        
  84.         throw new Exception('Deze rol ('.$role.') bestaat niet');
  85.     }
  86.    
  87.     protected function getResource($resource)
  88.     {
  89.         /*
  90.         if($resource instanceof acl_resource)
  91.         {
  92.             return $resource;
  93.         }
  94.         */
  95.         $this->isInstance($resource, 'acl_resource');
  96.        
  97.         if(isset($this->resources[(string)$resource]))
  98.         {
  99.             $resource = $this->resources[(string)$resource];
  100.             /*
  101.             if($resource instanceof acl_resource)
  102.             {
  103.                 return $resource;
  104.             }
  105.             */
  106.             $this->isInstance($resource, 'acl_resource');
  107.         }
  108.        
  109.         throw new Exception('Deze resource ('.$resource.') bestaat niet');
  110.     }
  111.    
  112.     protected function getRule(acl_role $role)
  113.     {
  114.         $roleName = (string)$role;
  115.        
  116.         if(isset($this->rules[$roleName]))
  117.         {
  118.             return $this->rules[$roleName];
  119.         }
  120.        
  121.         return 0;
  122.     }
  123.    
  124.     protected function setRule(acl_role $role, $value)
  125.     {
  126.         $roleName = (string)$role;
  127.         $this->rules[$roleName] = $value;
  128.     }
  129.    
  130.     public function allow($role, $resource)
  131.     {
  132.         $role = $this->getRole($role);
  133.         $resource = $this->getResource($resource);
  134.        
  135.         $this->setRule($role, $this->getRule($role) | $resource->getBit());
  136.         return $this;
  137.     }
  138.    
  139.     public function extend($role, $extendRole)
  140.     {
  141.         $role = $this->getRole($role);
  142.         $extendRole = $this->getRole($extendRole):
  143.        
  144.         $this->setRule($role, $this->getRule($role) | $this->getRule($extendRole));
  145.         return $this;
  146.     }
  147.    
  148.     public function deny($role, $resource)
  149.     {
  150.         $role = $this->getRole($role);
  151.         $resource = $this->getResource($resource);
  152.        
  153.         if(!$this->getRule($role) === 0)
  154.         {
  155.             return $this;
  156.         }
  157.        
  158.         $allow = decbin($this->getRule($role));
  159.         $length = strlen($allow);
  160.         $resBits = decbin($resource->getBit());
  161.         $resLength = strlen($resBits);
  162.        
  163.         for($i=1;$i<=$length;$i++)
  164.         {
  165.             if(isset($resBits{$resLength-$i}) and $allow{$length-$i} == $resBits{$resLength-$i})
  166.             {
  167.                 $allow{$length-$i} = 0;
  168.             }
  169.         }
  170.        
  171.         $this->setRule($role, bindec($allow));
  172.         return $this;
  173.     }
  174.    
  175.     public function isAllowed($role, $resource)
  176.     {
  177.         $resource = $this->getResource($resource);
  178.         return (bool)($resource->getBit() & $this->getRule($this->getRole($role)));
  179.     }
  180. }
  181.  
  182. class acl_role
  183. {
  184.     protected $name;
  185.    
  186.     public function __construct($name)
  187.     {
  188.         $this->name = $name;
  189.     }
  190.    
  191.     public function __toString()
  192.     {
  193.         return (string)$this->name;
  194.     }
  195. }
  196.  
  197. class acl_resource
  198. {
  199.     protected $name;
  200.     protected $bit;
  201.     static public $exp = 0;
  202.    
  203.     public function __construct($name)
  204.     {
  205.         $this->bit = pow(2, self::$exp++);
  206.         $this->name = $name;
  207.     }
  208.    
  209.     public function getBit()
  210.     {
  211.         return (int)$this->bit;
  212.     }
  213.    
  214.     public function __toString()
  215.     {
  216.         return (string)$this->name;
  217.     }
  218. }
  219. ?>
  220.  


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.

vlerknozem
Admin
avatar
# Gepost op 03-08-2010 02:07


Ik heb hier ook nog niet veel ervaring mee. Zowieo wil ik dit systeem eerst los testen en uitwerken zodat ik niet 100 keer alles hoef aan te passen.

Lees de forum regels

sebastiaan
member
avatar
# Gepost op 03-08-2010 02:18


Citaat van vlerknozem
Zowieo wil ik dit systeem eerst los testen en uitwerken zodat ik niet 100 keer alles hoef aan te passen.

Verstandig. Maar je bent het wel met mee eens dat dit een makkelijkere manier van rechten geven is dan dat er nu in WP zit?

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

vlerknozem
Admin
avatar
# Gepost op 03-08-2010 13:46


Ik denk van wel :)

Lees de forum regels

vlerknozem
Admin
avatar
# Gepost op 03-08-2010 14:53


Oke ik heb even zitten denken en het lijkt me slim om per module een ACL klasse te maken. Hierdoor krijg je niet dat je in module A de rechten van module B overschrijft (dat zou ten koste gaan van de veiligheid).

In de constructor van een module wil ik dan de roles toevoegen en met $this->acl kan je de klasse dan benaderen. De roles wil ik toevoegen vanuit een role bestand per module.

Met de module pAdmin zou het mogelijk moeten worden om deze role-bestandjes te wijzigen op een simpele en goede manier (hoe precies weet ik nog niet).

Zodra dit systeem is ingebakken moet het paralel werken ten opzichte van het oude rechten systeem. Hierdoor zal alles nog normaal werken. Vervolgens met een test module kijken of alles naar behoren werkt.

Als we tevreden zijn dan kunnen we een voor een elke module en plugin aanpassen op dit systeem en zodra alles geupdate is kan het oude systeem eruit worden gebouwd.

---

Wat denk van dit voorstel sebas?

Lees de forum regels

sebastiaan
member
avatar
# Gepost op 03-08-2010 14:55


Een wijs idee, op een ding na. Ik zou een basis ACL permissie file maken (waar je de basis inzet) en als het nodig is per module een aanpassing. Dus niet voor elke module een ACL instantie, maar meer een uitbreiding op een bestaande ACL.

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

vlerknozem
Admin
avatar
# Gepost op 03-08-2010 15:19
Bewerkt door vlerknozem op 03-08-2010 15:20


Ja oke daar zit wat in :) Heb alleen nog even geen idee hoe dat het beste uitgewerkt kan worden.

Lees de forum regels

sebastiaan
member
avatar
# Gepost op 04-08-2010 22:39


Zoals ik zei: elke module/plugin de standaard ACL file (waar alle allow's, deny's enzo inzitten) laten includen en als een mod/plugin iets anders vereist dat zo instellen (dus dan niet de standaard acl file includen)

Mijn software heeft geen bugs. Het ontwikkelt gewoon ongedocumenteerde functies.

Vorige ( 1 ) Volgende

U moet aangemeld zijn om een reactie te kunnen plaatsen.

Indien u nog geen account heeft kunt u zich hier registreren.



© copyright 2009/2010 WebProjects 1.02 - Template van Sebastaan Franken