[alg]Opzet ACL

Pagina: 1
Acties:

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 21-04 16:00
Ik ben bezig met een Access Control Manager voor een webproject en vroeg mij af of mijn opzet wel goed is.

Mijn database ziet er als volgt uit
Afbeeldingslocatie: http://tmp.street-maniacs.nl/database.png

Zoals je kan zien zijn de gebruikers op gedeelt in groepen en worden rechten uitgedeelt op de groepen, het is niet mogelijk rechten te geven op gebruikers zelf.

de AROtree ziet er als volgt uit
code:
1
2
3
4
5
6
7
8
ARO
|
|-AXO1
|      |-ACO1
|      |-ACO2
|-AXO2
|      |-ACO1
|      |-ACO2


In dit geval zijn de groepen dus ARO's Er wordt dus eerst gegeken of een ARO een AXO mag uitvoeren, vervolgens wordt gekeken op welke ACO deze AXO mag worden uitgevoerd. Deze informatie wordt opgehaald als een gebruiker inlogt en vervolgens opgeslagen in een sessie om de databaseload laag te houden.

de Sessie ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
$_SESSION['user']['acl'] = 
array(
           'createNew' = array('newsArticle', 'user','contentPage','ect...'),
           'edit' =  array('newsArticle', 'user','contentPage','ect...'),
           'delete' =  array('newsArticle', 'user','contentPage','ect...'),
           'meerActions' = array('meerControlObjects');
)


Code om te tree controleren is ongeveer als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* 
 * @function    aclCheck
 * @description    Check if a ARO can perform a AXO on a ACO, returns true if aXO is allowed, flase if otherwise
 * @param    string    Action name
 * @param    string    Access Control Object name
 * @param    int         USerID optional
 * @return     bool
**/
function aclCheck($axo, $aco, $userID = $_SESSION['user']['userId'])
{
    if($userID != $_SESSOIN['user']['userId'])
    {
        /* code om tree opnieuw te bouwen uit database voor betreffende userId */
    }
      
   /*Check for ACL */
   if(!is_array($_SESSION['user']['acl']))
    {
        /* No ACL for this user */
        return false;
    }
    
    if(!array_key_exists($axo, $_SESSION['user']['acl'])
    {
        /* No AXO's defined for this ARO */
        return false;
    }
    
    /* Is ACO defined within this AXO? */
    if(in_array($aco, $_SESSION['user']['acl'][$axo]))
    {
        return true;
    }
    return false;
}

Ik weet dat rbac op veel manieren is te implementeren, dit lijkt mij de meest eenvoudige. Ik heb niet gekozen voor bestaande oplossingen zoals phpGacl aangezien deze vaak te overdone zijn. Opmerkingen en/of aanmerkingen zijn meer als welkom.


Edit
De begrippen:

ARO, Access Request Object. Een object dat vraagt of een AXO mag worden uitgevoerd op een ACO
ACO, Access Controll object, hier worden een AXO op uit gevoerd door een ARO
AXO, Access Axiotn Object, de actie die door ARO wordt uitgevoerd op ACO.
Concreet stel je de vraag "Mag ARO AXO uitvoeren op AXO" of wel "Mag de actie bewerken uitvoeren op contentPagina".

- Piet is een ARO, hij vraagt immer om toestemming
- contentPagina is een ACO, er wordt gevraagd of een bewerking mag worden uitgevoerd op contentPagina
- bewerken is een AXO, het is de actie die Piet wil uitvoeren op contentPagina.

[ Voor 117% gewijzigd door Suepahfly op 16-07-2005 15:45 . Reden: ik deed verstuur ipv bekijk |:( ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:58
Misschien een idee om even je begrippen te verklaren. Ik weet redelijk wat van PHP maar door het gebruik van de afkortingen is je verhaal redelijk lastig te begrijpen.

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 21-04 16:00
zie edit :)

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 21-04 16:00
Kickje, Is er niemand die wat meer van dit onderwerp afweet?

Aangezien het de eerste keer is dat iets dergelijks wil maken zou het heel fijn zijn om op/aanmerkingen te krijgen.