Bitwise rechten systeem
Bitwise rechten systeem om te bepalen wie welke rechten heeft d.m.v. PHP.
Gesponsorde koppelingen
Inhoudsopgave
38 reacties op 'Bitwise rechten systeem'
Gesponsorde koppelingen
Goede tutorial, ik was al bezig met mijn admin panel te upgraden naar een bitwise systeem. Nu heb ik ook een referentie pagina waar ik kan checken of ik het goed doe ^.^
Overigens is deze website ook een goede referentie pagina.
Overigens is deze website ook een goede referentie pagina.
Let wel op: Bassie heeft het o.a. over optellen van de rechten. Zoals hij het beschrijft klopt dat. Maar je kan niet zomaar iemands rechten verhogen door iets bij die userrights op te tellen. Stel iemand heeft reeds als recht 1 en je wilt dat diegene rechten 1, 2 en 4 heeft. Als je dat zomaar optelt bij de reeds aanwezige 1 dan kom je op 8. En dat is een heel ander recht. Dus altijd alle rechten optellen en dan de aanwezige waarde overschrijven.
Dit systeem laat mensen in ieder geval zien dat het ook anders kan.
Toch ben ik zelf niet helemaal voorstander van deze uitvoering. Wel van het idee. Het is namelijk eigenlijk een Access Control List. Alleen ik vind deze een beetje ingewikkeld/omslachtig. Maarja, iets met meerdere wegen en Rome :)
Toch ben ik zelf niet helemaal voorstander van deze uitvoering. Wel van het idee. Het is namelijk eigenlijk een Access Control List. Alleen ik vind deze een beetje ingewikkeld/omslachtig. Maarja, iets met meerdere wegen en Rome :)
Ik zou een Access Control List gebruiken. Je kunt dit eventueel koppelen aan een database. Een voorbeeldje uit mijn code voor een blog-website:
Je hebt guests, members en admins in dit geval. Een member mag meer dan een guest, etc. Je ziet hier ook dat een member alleen z'n eigen reply mag veranderen. Daarom krijg je Acl_Auth_Member(). Die class controleert dan of de huidige member ($auth) rechten heeft voor het aanpassen van de huidige pagina.
Je maakt een duidelijk onderscheid tussen autorisatie (gebruikersrechten) en authenticatie (inloggen, identiteit).
Zoals je snapt kun je bovenstaand ook direct uit een database laden om nog specifiekere rechten te geven.
In $auth heb je trouwens functies als hasIdentity() (=ingelogd). Zeg maar de dingen die je normaal in een session zou doen.
Per pagina (request) checkt bovenstaand script of de huidige type gebruiker (guest, member, admin) rechten heeft tot de huidige resource (index, blog, etc) en de huidige actie (reply, editreply, etc). Dit komt in dit geval uit een volledige Model View Controller omgeving, maar dat is niet per se nodig.
Ik raad je aan eens te googlen, er zijn simpelere voorbeelden.
Voordeel van zo'n ACL is dat je het ??n keer maakt en verder nooit meer ergens te maken krijgt met rechten of identiteiten; je zorgt er gewoon van te voren al voor dat een gebruiker nooit een stuk script kan bereiken waar hij geen rechten toe heeft.
Code (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
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
<?php
class Acl extends Zend_Acl
{
public function __construct(Zend_Auth $auth)
{
$this ->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('member'), 'guest')
->addRole(new Zend_Acl_Role('admin'))
->add(new Zend_Acl_Resource('index'))
->add(new Zend_Acl_Resource('login'))
->add(new Zend_Acl_Resource('error'))
->add(new Zend_Acl_Resource('blog'))
->allow('guest', 'index')
->allow('guest', 'login')
->allow('guest', 'error')
->allow('guest', 'blog')
->deny('guest', 'blog', 'reply')
->deny('guest', 'blog', 'editreply')
->deny('guest', 'blog', 'add')
->deny('guest', 'blog', 'edit')
->allow('member', 'blog', 'reply')
->allow('member', 'blog', 'editreply', new Acl_Auth_Member($auth))
->allow('admin');
}
}
?>
class Acl extends Zend_Acl
{
public function __construct(Zend_Auth $auth)
{
$this ->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('member'), 'guest')
->addRole(new Zend_Acl_Role('admin'))
->add(new Zend_Acl_Resource('index'))
->add(new Zend_Acl_Resource('login'))
->add(new Zend_Acl_Resource('error'))
->add(new Zend_Acl_Resource('blog'))
->allow('guest', 'index')
->allow('guest', 'login')
->allow('guest', 'error')
->allow('guest', 'blog')
->deny('guest', 'blog', 'reply')
->deny('guest', 'blog', 'editreply')
->deny('guest', 'blog', 'add')
->deny('guest', 'blog', 'edit')
->allow('member', 'blog', 'reply')
->allow('member', 'blog', 'editreply', new Acl_Auth_Member($auth))
->allow('admin');
}
}
?>
Je hebt guests, members en admins in dit geval. Een member mag meer dan een guest, etc. Je ziet hier ook dat een member alleen z'n eigen reply mag veranderen. Daarom krijg je Acl_Auth_Member(). Die class controleert dan of de huidige member ($auth) rechten heeft voor het aanpassen van de huidige pagina.
Je maakt een duidelijk onderscheid tussen autorisatie (gebruikersrechten) en authenticatie (inloggen, identiteit).
Zoals je snapt kun je bovenstaand ook direct uit een database laden om nog specifiekere rechten te geven.
In $auth heb je trouwens functies als hasIdentity() (=ingelogd). Zeg maar de dingen die je normaal in een session zou doen.
Per pagina (request) checkt bovenstaand script of de huidige type gebruiker (guest, member, admin) rechten heeft tot de huidige resource (index, blog, etc) en de huidige actie (reply, editreply, etc). Dit komt in dit geval uit een volledige Model View Controller omgeving, maar dat is niet per se nodig.
Ik raad je aan eens te googlen, er zijn simpelere voorbeelden.
Voordeel van zo'n ACL is dat je het ??n keer maakt en verder nooit meer ergens te maken krijgt met rechten of identiteiten; je zorgt er gewoon van te voren al voor dat een gebruiker nooit een stuk script kan bereiken waar hij geen rechten toe heeft.
@Evert en Herjan
Het aantal losstaande taken is beperkt, maar dat is meestal wel zo. Je kan hier als admin ook maar:
nieuws/scripts/tutorials/topics/boeken (5x) verwijderen/editen/ maken (3x) dus dat is totaal 15
Dan heb je nog 'alle berichten wijzigen' en 'commentaar in profiel' en 'toegang tot admintopic' en 'topic locken' dat is nog eens 4 erbij.(totaal 19). dan hou je nog zat ruimte over voor gasten/ leden: het aanmaken van zaken is ook bij de admins al gedefini?erd, dus er komt nog bij: 'eigen berichten bewerken' enz..
Als je alles hier optelt -> kom je niet aan de 63 taken. Er zit inderdaad een beperking aan, maar is het een beperking waar je last van gaat hebben, dat is de juiste vraag.
Het aantal losstaande taken is beperkt, maar dat is meestal wel zo. Je kan hier als admin ook maar:
nieuws/scripts/tutorials/topics/boeken (5x) verwijderen/editen/ maken (3x) dus dat is totaal 15
Dan heb je nog 'alle berichten wijzigen' en 'commentaar in profiel' en 'toegang tot admintopic' en 'topic locken' dat is nog eens 4 erbij.(totaal 19). dan hou je nog zat ruimte over voor gasten/ leden: het aanmaken van zaken is ook bij de admins al gedefini?erd, dus er komt nog bij: 'eigen berichten bewerken' enz..
Als je alles hier optelt -> kom je niet aan de 63 taken. Er zit inderdaad een beperking aan, maar is het een beperking waar je last van gaat hebben, dat is de juiste vraag.
Wegens het doen van berekeningen daarmee denk ik, er zal toch een maximum aan moeten zitten, om systemen niet zo snel overbelast te laten geraken. Daarnaast heb je er niets aan om nog veel grotere getallen weer te gaan geven, tenzij in de wetenschappelijke notatie.
php.net:
The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.
Robert:
Er zit inderdaad een beperking aan, maar is het een beperking waar je last van gaat hebben, dat is de juiste vraag.
Ik denk ook dat de meesten er geen last van zullen hebben, maar het is zeker wel belangrijk om te vermelden. Laatst moest ik namelijk een rechtensysteem schrijven waarbij wel degelijk meer dan 63 taken mogelijk moesten zijn, en ik denk dat er nog wel meer mensen zijn die iets dergelijks nodig hebben.
Misschien een puntje voor Bas om even erbij te zetten in zijn tutorial als opmerking?
Stel de volgende rechten zijn er:
Stel je voor dat gebruikers die kunnen bannen iedereen die lager als hun staat kan bannen. Maar ze zouden ook nieuws posters / verwijderaars moeten kunnen verwijderen. Maar als je dat bovenstaande test krijg je toch de error, want 4 is kleiner dan 8 of 16. Hoe lost 't bitwise systeem dit op ?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$rechten['user_edit'] = 1;
$rechten['user_del'] = 2;
$rechten['user_ban'] = 4;
$rechten['nieuws_add'] = 8;
$rechten['nieuws_del'] = 16;
?>
$rechten['user_edit'] = 1;
$rechten['user_del'] = 2;
$rechten['user_ban'] = 4;
$rechten['nieuws_add'] = 8;
$rechten['nieuws_del'] = 16;
?>
Stel je voor dat gebruikers die kunnen bannen iedereen die lager als hun staat kan bannen. Maar ze zouden ook nieuws posters / verwijderaars moeten kunnen verwijderen. Maar als je dat bovenstaande test krijg je toch de error, want 4 is kleiner dan 8 of 16. Hoe lost 't bitwise systeem dit op ?
De volgorde maakt niet uit. Je kun toch gewoon doen:
Ik heb bijvoorbeeld een 'admin' level. Die mag alles. Het maakt niet uit of het level 'admin' 1 of 64 is. Als je geen admin bent, laat je dat level (1 bijv) eruit en komt hij niet bitwise voor en heeft hij dus geen admin rechten. Het werkt dus niet zo, dat alles wat hoger is, ook toegang heeft tot alles wat eronder valt. Dat vind ik dus het mooie eraan. Je kunt het natuurlijk wel zo maken in je code (als level hoger is dan X dan mag je dit ook).
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
// $user['rechten'] = db waarde
if ($user['rechten'] & $rechten['user_ban'])
{
// ik mag alles
}
?>
// $user['rechten'] = db waarde
if ($user['rechten'] & $rechten['user_ban'])
{
// ik mag alles
}
?>
Ik heb bijvoorbeeld een 'admin' level. Die mag alles. Het maakt niet uit of het level 'admin' 1 of 64 is. Als je geen admin bent, laat je dat level (1 bijv) eruit en komt hij niet bitwise voor en heeft hij dus geen admin rechten. Het werkt dus niet zo, dat alles wat hoger is, ook toegang heeft tot alles wat eronder valt. Dat vind ik dus het mooie eraan. Je kunt het natuurlijk wel zo maken in je code (als level hoger is dan X dan mag je dit ook).
Dat kan je niet echt doen lijkt mij. Staat iemand die berichten mag editen/plaatsen hoger of lager dan iemand die gebruikers mag verwijderen? Dit systeem heeft dit niet ingebouwd veronderstel ik. Ook if(rechten1 < rechten2) kan niet goed werken denk ik, of je zou moeten de verschillende acties heel erg goed gesorteerd hebben.
Ik zou als ik het bitwise systeem toepas, niet elke actie een nr. geven, maar met groepen waar users behoren een nr. geven. En om nou 64 groepen te hebben is minder snel haalbaar dan 64 mogelijke acties te hebben.
Ik zou als ik het bitwise systeem toepas, niet elke actie een nr. geven, maar met groepen waar users behoren een nr. geven. En om nou 64 groepen te hebben is minder snel haalbaar dan 64 mogelijke acties te hebben.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$groep['ban'] = 0;
$groep['gast'] = 1;
$groep['lid'] = 2;
$groep['redacteur'] = 4;
$groep['reactiemod'] = 8;
$groep['moderator'] = 16;
$groep['administrator'] = 32;
/* .... */
// bericht deleten (moderators en administrators)
if($_GET['action'] == 'delete' && $_SESSION['group'] & 48 ){
// ok
}
?>
$groep['ban'] = 0;
$groep['gast'] = 1;
$groep['lid'] = 2;
$groep['redacteur'] = 4;
$groep['reactiemod'] = 8;
$groep['moderator'] = 16;
$groep['administrator'] = 32;
/* .... */
// bericht deleten (moderators en administrators)
if($_GET['action'] == 'delete' && $_SESSION['group'] & 48 ){
// ok
}
?>
Of je moet ervoor zorgen dat je kleinere levels minder verantwoordelijkheid geeft en dan idd wat Ronald zegt het kleiner als gebruiken.. Maar dan kun je beter een ander systeem gebruiken.. Dit is gewoon t? gemakkelijk om verschillende opties aan of uit te vinken bij een gebruiker, ongeacht of hij hoger of lager is.
Ik ben bezig aan een rechten systeem die per pagina/ actie aangeeft wie wat wel en / of niet mag doen. Dit gebeurt met behulp van een database.
Het CMS slaat pagina's op in de database, dus deze informatie is al beschikbaar. Er is een rechtenpagina waarbij per user (of usergroep) aangegeven kan worden of je een pagina kan editen, deleten of evt. een nieuwe toevoegen. Dit geldt voor alle pagina's. Kwestie van aanvinken, het wordt toegevoegd en het is eenvoudig te controleren. Het menu wordt ook automatisch samengesteld, aan de hand van deze rechten. Is gemakkelijk werken als het klaar is, en een hele boel mogelijkheden.
Het CMS slaat pagina's op in de database, dus deze informatie is al beschikbaar. Er is een rechtenpagina waarbij per user (of usergroep) aangegeven kan worden of je een pagina kan editen, deleten of evt. een nieuwe toevoegen. Dit geldt voor alle pagina's. Kwestie van aanvinken, het wordt toegevoegd en het is eenvoudig te controleren. Het menu wordt ook automatisch samengesteld, aan de hand van deze rechten. Is gemakkelijk werken als het klaar is, en een hele boel mogelijkheden.
voorbeeldje van code die je ff kan draaien ter verduidelijking:
let overigens ff niet op die namen.. had er misschien beter wat anders van kunnen maken maar het gaat om het idee..
edit: toch ff andere namen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$testarr = array();
$recht['read_post'] = 1;
$recht['write_post'] = 2;
$recht['edit_own_post'] = 4;
$recht['delete_own_post'] = 8;
$recht['edit_other_post'] = 16;
$recht['delete_other_post'] = 32;
$recht['move_post'] = 64;
$recht['move_multiple_posts'] = 128;
for($i = 0; $i<= (max($recht)*2)-1; $i++){
$testarr[$i] = array();
foreach($recht as $k => $v){
if($v & $i){
$testarr[$i][] = $k;
}
}
}
print_r($testarr);
?>
$testarr = array();
$recht['read_post'] = 1;
$recht['write_post'] = 2;
$recht['edit_own_post'] = 4;
$recht['delete_own_post'] = 8;
$recht['edit_other_post'] = 16;
$recht['delete_other_post'] = 32;
$recht['move_post'] = 64;
$recht['move_multiple_posts'] = 128;
for($i = 0; $i<= (max($recht)*2)-1; $i++){
$testarr[$i] = array();
foreach($recht as $k => $v){
if($v & $i){
$testarr[$i][] = $k;
}
}
}
print_r($testarr);
?>
let overigens ff niet op die namen.. had er misschien beter wat anders van kunnen maken maar het gaat om het idee..
edit: toch ff andere namen.
@evert:
Ja, er zit een limiet op de waarde die een integer kan hebben. En die heeft te maken met de grootte van registers (hardware). Computers kunnen geen registers "koppelen" om grote getallen te plaatsen.
Wat je zou kunnen doen om de grens van 32 of 64 bits te doorbreken is een dubbele uitvraging doen (dus tegen twee integers testen). Of drie, mocht je ambities hebben om een wereldwijd rechtensysteem te schrijven :-)
Ja, er zit een limiet op de waarde die een integer kan hebben. En die heeft te maken met de grootte van registers (hardware). Computers kunnen geen registers "koppelen" om grote getallen te plaatsen.
Wat je zou kunnen doen om de grens van 32 of 64 bits te doorbreken is een dubbele uitvraging doen (dus tegen twee integers testen). Of drie, mocht je ambities hebben om een wereldwijd rechtensysteem te schrijven :-)
Hier: http://www.phphulp.nl/php/scripts/4/1441/ heb ik trouwens ook een toepassing (class) gemaakt die ook gebruik maakt van bitwise rechten.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Bas Kreleger- 4 jaar geleden
- 2.680 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Beveiliging
- Nieuwste PHP tutorials
- PHP tutorial toevoegen

PHP hulp
0 seconden vanaf nu