Bitwise rechten systeem

Door B a s, 19 jaar geleden, 10.273x bekeken

Bitwise rechten systeem om te bepalen wie welke rechten heeft d.m.v. PHP.

Gesponsorde koppelingen

Inhoudsopgave

  1. Inleiding
  2. Een manier van een rechten systeem
  3. Bitwise rechten systeem

 

Er zijn 37 reacties op 'Beveiliging'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
GaMer B
GaMer B
19 jaar geleden
 
0 +1 -0 -1
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.
Jan geen
Jan geen
19 jaar geleden
 
0 +1 -0 -1
Heeft een hoger niveau ook automatisch toegang tot de lagere? Dus een admin kan alles wat een member ook kan?
- SanThe -
- SanThe -
19 jaar geleden
 
0 +1 -0 -1
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.
B a s
B a s
19 jaar geleden
 
0 +1 -0 -1
Rik, stel je wilt een globale admin dat die alles kan wat er mogelijk is, dan tel je alle rechten bij elkaar op. Een hoger getal heeft dus niet automatisch rechten over een lager getal.
- -
- -
19 jaar geleden
 
0 +1 -0 -1
Op deze manier kun je - afhankelijk van je systeem - toch maar 31 of 63 verschillende taken defini?ren? Of zie ik het nu fout? Want op een gegeven moment bereik je de maximale waarde voor een integer in PHP.
Iltar van der berg
iltar van der berg
19 jaar geleden
 
0 +1 -0 -1
Heb je toevallig ook een OOP versie als voorbeeld ?
Simon Blok
Simon Blok
19 jaar geleden
 
0 +1 -0 -1
Interessant! Thx Bas
PHP erik
PHP erik
19 jaar geleden
 
0 +1 -0 -1
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 :)
Simon Blok
Simon Blok
19 jaar geleden
 
0 +1 -0 -1
@PHPerik,
Hoe zou jij het oplossen?
PHP erik
PHP erik
19 jaar geleden
 
0 +1 -0 -1
Ik zou een Access Control List gebruiken. Je kunt dit eventueel koppelen aan een database. Een voorbeeldje uit mijn code voor een blog-website:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
    }
}

?>


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.


19 jaar geleden
 
0 +1 -0 -1
Zend_Acl ^O^
oh en ps waarschijnlijk was het voor de duidelijkheid van de tut veel beter geweest om het bineaire stelsel te gebruiken i.p.v. het decimale.
GaMer B
GaMer B
19 jaar geleden
 
0 +1 -0 -1
XD Zo kan mijn vader het ook PHPerik :P
P Lekensteyn
P Lekensteyn
19 jaar geleden
 
0 +1 -0 -1
Mooie tut


19 jaar geleden
 
0 +1 -0 -1
@gamer13 en je punt is...?
Robert Deiman
Robert Deiman
19 jaar geleden
 
0 +1 -0 -1
@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.
Robert Deiman
Robert Deiman
19 jaar geleden
 
0 +1 -0 -1
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.
- -
- -
19 jaar geleden
 
0 +1 -0 -1
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?
Jeffrey H
Jeffrey H
19 jaar geleden
 
0 +1 -0 -1
Hoe zou je dan die oplossing van PHPErik zonder het Zend Framework kunnen gebruiken?? Volgens mij kan dat alleen met array's, maar heeft een array dan niet een limiet??
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
19 jaar geleden
 
0 +1 -0 -1
Stel de volgende rechten zijn er:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>

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 ?
B a s
B a s
19 jaar geleden
 
0 +1 -0 -1
De volgorde maakt niet uit. Je kun toch gewoon doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
// $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).
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
19 jaar geleden
 
0 +1 -0 -1
*snapt even helemaal niks meer van het hele bitwise systeem :(*

Het begint een beetje te dagen.. Snap alleen nog niet hoe je wilt gaan bepalen dat als een gebruiker andere gebruikers mag verwijderen, WIE hij mag verwijderen.. (Ervan uitgaand dat hij alleen mensen lager dan hem mag verwijderen)
GaMer B
GaMer B
19 jaar geleden
 
0 +1 -0 -1
Ligt het aan mij of moet je dan niet alle rechten van de gebruikers updaten wanneer je een recht toevoegt? =s
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
19 jaar geleden
 
0 +1 -0 -1
Nee, zover ik het begrijp alleen de rechten bijwerken van diegene die dat nieuwe recht krijgen. (Ook weer iets moois aan bitwise?)

Heb echter geen antwoord op mijn vraag, hoe stel ik het in dat een gebruiker met de rechten om te verwijderen iedereen die lager als hem staat mag verwijderen?
Hipska BE
Hipska BE
19 jaar geleden
 
0 +1 -0 -1
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
}

?>
Ronald
Ronald
19 jaar geleden
 
0 +1 -0 -1
@Toysoldier, dan doe je toch gewoon;

als mijn rechten < rechten gebruiker die ik wil verwijderen?
- SanThe -
- SanThe -
19 jaar geleden
 
0 +1 -0 -1
Bitwise mensen. Dat houdt in dat je niet werkt met groter/kleiner dan, maar je werkt met AND, OR, EOR enz., maar dan op bitniveau.
B a s
B a s
19 jaar geleden
 
0 +1 -0 -1
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.
Robert Deiman
Robert Deiman
19 jaar geleden
 
0 +1 -0 -1
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.
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
19 jaar geleden
 
0 +1 -0 -1
Klinkt goed :) Ik ben nu voor iemand een control panel voor nieuws, poll, gebruikers en nog meer dingen aan 't bouwen, met dat bitwise systeem maar het is lastig zo in te stellen wie wat mag.. Het is wel makelijk bewerken met bitwise, rechten voor user apart & groepen, handig systeem :)
GaMer B
GaMer B
19 jaar geleden
 
0 +1 -0 -1
Zou dan eerder gaan voor een ACL based systeem als je veel verschillende dingen wilt instellen. Zo kun je per groep EN per gebruiker alles instellen.
Robert Deiman
Robert Deiman
19 jaar geleden
 
0 +1 -0 -1
@GaMer13

Dat gaat het uiteindelijk ook worden. In principe gaat het per groep, maar er kan ook 1 persoon in een bepaalde groep zitten, waarmee je daar helemaal geen problemen mee hebt.
Mathijs -
Mathijs -
19 jaar geleden
 
0 +1 -0 -1
voorbeeldje van code die je ff kan draaien ter verduidelijking:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>



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.
John Zondag
John Zondag
19 jaar geleden
 
0 +1 -0 -1
@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 :-)
Arian Stolwijk
Arian Stolwijk
19 jaar geleden
 
0 +1 -0 -1
Hier: http://www.phphulp.nl/php/scripts/4/1441/ heb ik trouwens ook een toepassing (class) gemaakt die ook gebruik maakt van bitwise rechten.
Rick D
Rick D
16 jaar geleden
 
0 +1 -0 -1
Leuk scriptje
Tobias Tobias
Tobias Tobias
16 jaar geleden
 
0 +1 -0 -1
Geniaal! Ik zocht al naar een goede manier voor rechten, zonder voor iedere unieke pagina een nieuwe kolom aan te hoeven maken in de rechten-tabel
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
- Dave -
- Dave -
16 jaar geleden
 
0 +1 -0 -1
Ik heb ook een CMS gemaakt en daarbij een bitwise rechtensysteem gemaakt.
Werkt echt super. :)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Inleiding
  2. Een manier van een rechten systeem
  3. Bitwise rechten systeem

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.