ACL Roles en Resources Mysql

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 04-10 00:53
Ik vroeg me af of het volgende mogelijk is. Ik heb drie tabellen. Roles en Resources en Roles_Resources

De roles tabel heeft de volgende velden:
- id
- name
- parent

Het veld parent bevat (eventueel) een verwijzing naar een andere role om zo een 'overerving' systeem te hebben. Bijvoorbeeld de gebruiker admin erft van gebruiker welke van gast erft. Zodat als een gast extra toegang krijgt dit ook toegankelijk is voor de admin en ingelogde gebruikers.

De resource tabel heeft de volgende velden
- id
- name

De laatste tabel is een koppelingstabel.

Roles_Resources
- roleId
- resourceId

Is het mogelijk om in één query te kijken of 'admin' ergens rechten toe heeft waar de gebruiker gast ook toegang tot heeft. (Door gebruik te maken van het parent veld in roles).

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Je zou een relationele opstelling kunnen maken... het is toch niet voor niets een relationele database :)

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 04-10 00:53
johnkeates schreef op zaterdag 12 november 2011 @ 14:12:
Je zou een relationele opstelling kunnen maken... het is toch niet voor niets een relationele database :)
En hoe zou ik dit aan moeten passen om het meer 'relationeel' te maken? Voor zo ver ik weet is dit al relationeel dmv de koppeltabel met een veel op veel relatie.

[ Voor 13% gewijzigd door ZpAz op 12-11-2011 14:13 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

In MySQL is zo'n beetje je enige optie om alle records op te halen en in je code de tree uit te bouwen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Zelf maak ik gebruik van RBAC (Role Based Access Control) en daar heb ik ook meerdere queries nodig maar ik maak er gewoon een cache-variant van die ik opsla bij de user. Op het moment dat er ergens iets wijzigt qua rechten dan leeg ik alle caches en bouwt ie de eerste volgende keer weer een nieuwe cache op. Misschien is dat een idee om ook te doen, scheelt je een berg queries uitvoeren bij iedere request.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 04-10 00:53
True, dat zou ik ook kunnen toepassen, maar het blijft een vrij klein ACL systeem qua roles en en resources dus ik verwacht niet dat dit de vertragende factor op de website wordt.

Ik denk dat het systeem van NMe de beste oplossing is voor wat ik momenteel zoek.

edit: Ik heb het even zitten bekijken, maar volgens mij gaat het maximaal één child diep? Wat als je meerdere parents (grootparents, overgrootparents) kan hebben?

edit2: Heb het al opgelost door recursie. Kan hier en daar nog wel wat beter.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$results = $this->fetchAll($this->select()
    ->order('parent')
)->toArray();

$data = array();

//Put every role in their own part of the array
foreach($results as $role)
{
    $data[$role['id']] = $role;
}   
//Get all parents recursivly
foreach($results as &$role)
{
    $role['parents'] = substr($this->_findParent($data, $role['id']), 0, - 1);
}


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private function _findParent(&$roles, $roleId, $parents = '')
{
    $currentRole = $roles[$roleId];
    if($currentRole['parent'] != 0)
    {
        $parents .= $currentRole['parent'] . ',';
        $parents .= $this->_findParent($roles, $currentRole['parent']);
        return $parents;
    }
    else
    {
        return '';
    }   
}


resultaat:

code:
1
2
3
4
5
6
7
8
9
10
11
[1]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(5) "Admin"
    ["parent"]=>
    int(2)
    ["parents"]=>
    string(5) "2,3,4"
  }

[ Voor 78% gewijzigd door ZpAz op 12-11-2011 16:44 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Meerdere niveaus is natuurlijk niet fundamenteel anders in opzet vergeleken met een vaste opzet van twee niveaus. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Meerdere queries is trouwens niet echt nodig als je MPTT gebruikt ... het is wat extra parsing maar ook dat zou je gewoon kunnen cachen.

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
als het zo weinig rollen zijn zo je toch ook iets met bitwise kunnen doen? Wel makkelijk om te zien of iemand een bepaalde rol heeft etc.

Driving a cadillac in a fool's parade.

Pagina: 1