Jump to content
Sign in to follow this  
Uno

Acl completo in php

Recommended Posts

Vediamo se mi date una mano ad inquadrare come posso fare al meglio una cosa.

 

Vorrei implementare un sistema in cui ci sono:

 

  1. utenti e gruppi
  2. risorse (per esempio una pagina, ma anche una parte di essa per esempio un form o un pulsante)
  3. azioni (per esempio la tal risorsa la posso leggere, la posso cancellare, la posso modificare etc)

 

Non mi dite di usare un framework o una classe già pronta tipo phpgcl o tackle (mi piacciono entrambe ma non mi va di usare adodb o modificarle) .

Ho un vuoto da stamattina (vabbeh che sto facendo altre cose e ci ho pensato solo in doccia :asd:) e non riesco a trovare il sistema più logico per fare questa cosa.

 

L'unica che mi viene in mente al volo è creare le tre tabelle: user, risorse, azioni (4 con gruppi) e poi una tabella che collega le tre (4) a seconda dei casi.

Ma poi? Ogni volta costruisco un array tridimensionale (anzi quadrimensionale) per vedere se tizio del gruppo x in quel determinato punto può fare quella determinata azione su quella risorsa (quel punto appunto)?

Funzionerebbe, ma mi pare troppo complicato e dispendioso in termini di risorse.

 

Altrimenti meno dispendioso è sulla pagina stessa (che sarà uguale per x pagine, es un blog, un forum etc) stabilire delle risorse/azioni fisse per quel tipo di modulo e avere già dei campi in db sulla stessa tabella della pagina.

 

Il primo mi piacerebbe di più così è più semplice scrivere nuovi moduli o forse no tutto sommato....

 

Help.... intanto mi faccio un caffè :asd:

Share this post


Link to post
Share on other sites
Meno male che mi ha salvato la doccia di questa mattina.... :D

Se aspettavo voi, prrrrrr

a chi lo dici... la doccia e il wc aiutano sempre :emoticons_dent2020:

 

ci sono svariati metodi per fare un acl, due sono quelli che hai postato (volendo nel primo bastano 3 tabelle) dipende da quanto flessibile vuoi che sia.

Ho usato per molto tempo il primo metodo con array multidimensionali, ora adopero un altro metodo basato sugli operatori bitwise, ma è adatto solo se utilizzi i pochi gruppi e non è molto flessibile (nel senso che tiene conto solo dei gruppi e non dei singoli utenti)

Share this post


Link to post
Share on other sites

Nel mio framework ho trovato comodo usare una struttura tipo

 

Tabella: User

id name email password date type eccetera

 

 

Tabella: Privileges

id type type_user type_contents

 

Tabella: Contents

id author name content type sonof created modified eccetera...

 

così ogni utente appartiene ad un determinato tipo che quindi ha determinati permessi per determinati tipi di contenuti...

 

l'implementazione con PHP è anche piuttosto semplice... quando un utente fa il login se vuoi puoi memorizzare in sessione i suoi privilegi... ti copio-incollo un paio di funzioni della mia classe

 

   /** 
    * Get the privileges of the user 
    * @param $db PDOStatement 
    * @return $privileges array Array containing the privileges  
    * of the user 
    */ 
   function getPrivileges($db) 
   { 
       $privileges = array();         
       foreach($db->fetchAll(PDO::FETCH_ASSOC) as $row)  
       { 
           $privileges[]=array($row['type_contents']=>$row['type']);             
       }         
       return $privileges; 
   } 
   /** 
    * Check if the type of user can execute an action on a type 
    * of content 
    * @param $arr Usually an array generated by FW_User::getPrivileges 
    * @param $type_contents string The type of contents 
    * @param $type string The type of user 
    * @return $has boolean Default FALSE, but when the user has  
    * the privilege to do the action on a type of contents become TRUE 
    */ 
   function hasPrivilege(array $arr, $type_contents, $type) 
   {         
       $has = FALSE; 
       foreach($arr as $row) 
       { 
           if( isset($row["$type_contents"]) || isset($row['all']) ) 
           { 
               if( $row["$type_contents"]==$type || $row["$type_contents"]==='all' ) 
               { 
                   $has = TRUE; 
               } 
           }         

       } 
       return $has; 
   }

io la trovo molto comoda :fagiano:

Share this post


Link to post
Share on other sites
Nel mio framework ho trovato comodo usare una struttura tipo

 

Tabella: User

id name email password date type eccetera

 

 

Tabella: Privileges

id type type_user type_contents

 

Tabella: Contents

id author name content type sonof created modified eccetera...

 

così ogni utente appartiene ad un determinato tipo che quindi ha determinati permessi per determinati tipi di contenuti...

 

l'implementazione con PHP è anche piuttosto semplice... quando un utente fa il login se vuoi puoi memorizzare in sessione i suoi privilegi... ti copio-incollo un paio di funzioni della mia classe

 

   /** 
    * Get the privileges of the user 
    * @param $db PDOStatement 
    * @return $privileges array Array containing the privileges  
    * of the user 
    */ 
   function getPrivileges($db) 
   { 
       $privileges = array();         
       foreach($db->fetchAll(PDO::FETCH_ASSOC) as $row)  
       { 
           $privileges[]=array($row['type_contents']=>$row['type']);             
       }         
       return $privileges; 
   } 
   /** 
    * Check if the type of user can execute an action on a type 
    * of content 
    * @param $arr Usually an array generated by FW_User::getPrivileges 
    * @param $type_contents string The type of contents 
    * @param $type string The type of user 
    * @return $has boolean Default FALSE, but when the user has  
    * the privilege to do the action on a type of contents become TRUE 
    */ 
   function hasPrivilege(array $arr, $type_contents, $type) 
   {         
       $has = FALSE; 
       foreach($arr as $row) 
       { 
           if( isset($row["$type_contents"]) || isset($row['all']) ) 
           { 
               if( $row["$type_contents"]==$type || $row["$type_contents"]==='all' ) 
               { 
                   $has = TRUE; 
               } 
           }         

       } 
       return $has; 
   }

io la trovo molto comoda :fagiano:

 

Sto implementando una cosa simile anche se un pò diversa, grazie per il feedback :)

Share this post


Link to post
Share on other sites

Io, per una intranet ho usato RBAC. E` una sistema tipo le ACL ma piu` orientato alle risorse ed a quello che i ruoli possono fare sulle risorse.

 

Ho una tabella con i ruoli, una che collega gli utenti ai ruoli, una chiamata ACL che collega un po` tutto. Nella tabella ACL ho un capo con una relazione polimorfica, cioe` che puo` mappare piu` risorse. Per risorse intendo pagine, file ed altri oggetti. Nella ACL ci ho messo il ruolo, le risorse e il tipo di permesso, view, modify e publish (i permessi stanno nella loro tabella). La cosa piu' importante riguarda come collegare la ACL alle risorse:

 

tipo_risorsa - articolo, file etc.

risorsa_id - chiave primaria della risorsa

 

Nella risorsa, per esempio articolo, potete recuperare le ACL tipo_risorsa articolo con id 33. Verificate se l'utente fa parte di uno dei ruoli contenuti nelle ACL trovate e vedete questo ruolo se puo` leggere, scrivere, pubblicare, autorizzare...

 

E` molto potente ma puo` essere molto complessa da gestire, quindi e` molto importante fare una interfaccia semplice ed intuitiva.

Share this post


Link to post
Share on other sites
Io, per una intranet ho usato RBAC. E` una sistema tipo le ACL ma piu` orientato alle risorse ed a quello che i ruoli possono fare sulle risorse.

 

Ho una tabella con i ruoli, una che collega gli utenti ai ruoli, una chiamata ACL che collega un po` tutto. Nella tabella ACL ho un capo con una relazione polimorfica, cioe` che puo` mappare piu` risorse. Per risorse intendo pagine, file ed altri oggetti. Nella ACL ci ho messo il ruolo, le risorse e il tipo di permesso, view, modify e publish (i permessi stanno nella loro tabella). La cosa piu' importante riguarda come collegare la ACL alle risorse:

 

tipo_risorsa - articolo, file etc.

risorsa_id - chiave primaria della risorsa

 

Nella risorsa, per esempio articolo, potete recuperare le ACL tipo_risorsa articolo con id 33. Verificate se l'utente fa parte di uno dei ruoli contenuti nelle ACL trovate e vedete questo ruolo se puo` leggere, scrivere, pubblicare, autorizzare...

 

E` molto potente ma puo` essere molto complessa da gestire, quindi e` molto importante fare una interfaccia semplice ed intuitiva.

 

Si ho presente. E' molto potente, alla fine puoi gestire anche porzioni di pagina o singole immagini (per esempio) etc, il problema è che se non lo "replichi" diventa pesante su un sito grande.

Per replica intendo che dal mio punto di vista serve una sorta di cache (che di fatto è una replica) che accentra, per esempio in array, tutte le acl sugli oggetti di una pagina (per esempio) in modo da non dover rifare tutte le query ogni volta.

 

Io sto ancora valutando se gestire pagina per pagina o la categoria. Alla fine è forse inutile (e spreco di risorse) scendere a livello pagina se non in zone di "varie" intendo pagine che hanno un loro carattere autonomo e non parte di qualcosa, es, un thread di un forum etc...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×