[PHP] Bitwise rechten & grote getallen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 17-09 16:46
Beste allemaal,

Voor een leuk stukje software waarbij per groep en eventueel per gebruiker rechten toegekend moeten worden heb ik een eenvoudig bitwise-rechten systeempje geschreven.

In de database heb ik de rechten opgeslagen;

IDRechtBit
1X lezen2
2X schrijven4
3X wijzigen8
4X verwijderen16


En vervolgens controleer ik met een eenvoudig stukje code of iemand die rechten ook heeft;

PHP:
1
2
3
4
5
6
<?php
if((int)$gebruiker['rechten'] & (int)$groep['rechten'])
{
 //Woei
}
?>


Echter, de die-hard PHP'ers zien het al aankomen, loop ik nu tegen een limiet aan... Vanaf een bit als '2147483648', wat 'toevallig' mijn 32ste 'recht' is geworden loopt het hele gebeuren in het honderd doordat we nu aan het limiet van een 32bit integer zitten. Nu vind ik op internet een hoop op en aanmerkingen waarom dit probleem zich voordoet maar een oplossing zie ik daar niet tussen staan. Of ze zijn zo 'wiskundig' of 'technisch' dat ik er een klein beetje op vastloop.

Is hier een eenvoudige oplossing voor te verzinnen? Zou ik bovenstaande code bijv. in de database moeten uitvoeren (kan een database als MySQL met grotere getallen werken?) of zijn er mogelijk simpelere / nettere oplossingen te noemen? Juist het hele idee van één getal om de rechten toe te kunnen kennen aan een groep of gebruiker bevalt mij eigenlijk wel...

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Dan moet je 64 bit integers gaan gebruiken (de BIGINT in MySQL).

Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 17-09 16:46
In de DB worden de getallen dan wel goed opgeslagen maar PHP kan daar toch niet mee omgaan? En dan loop ik binnenkort waarschijnlijk weer tegen een limiet aan...

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Dan moet je overstappen op een ander rechtensysteem, waarbij je niet gelimiteerd bent aan het aantal mogelijke rechten.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

PHP kan daar wel mee omgaan als je een bigint class gebruikt. Maar ik denk dat je er beter aan doet een fatsoenlijk token based rechtensysteem in 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!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 17-09 20:43
Je kan ook op absolute rechten overstappen.
Ik zet namelijk alle rechten in een array, en benoem ze ook precies wat ze doen.
rEditUsername = 0/1 b.v.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Icey schreef op donderdag 29 oktober 2009 @ 11:10:
In de DB worden de getallen dan wel goed opgeslagen maar PHP kan daar toch niet mee omgaan? En dan loop ik binnenkort waarschijnlijk weer tegen een limiet aan...
Tja, ik zeg het niet om je te jennen maar "dat krijg je ervan" ;) Een bitwise systeem is gewoon bepertkt op een X aantal bits (be it 32 of 64 of whatever) en dat wist je van tevoren. Een bitwise rechtensysteem is maar zélden een slimme keuze om te maken; je maakt het jezelf moeilijk en de 'besparing' die je er mee haalt (qua opslagruimte) doet het dure onderhoud van de code in 99% van de gevallen al te niet. Met goed Normaliseren had je dit al voorkomen.

Maak gewoon een rechten tabel (permissies) en een koppeltabel met rechten->groep of rechten->rol of rechten->gebruiker, net wat er bij jou van toepassing is.
NMe schreef op donderdag 29 oktober 2009 @ 11:17:
Maar ik denk dat je er beter aan doet een fatsoenlijk token based rechtensysteem in te bouwen. :)
Of 't token based is of niet is niet echt relevant voor 't probleem ;)

[ Voor 13% gewijzigd door RobIII op 29-10-2009 11:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Hoe kom je aan 32 verschillende soorten rechten? Ben je niet in de war met rollen en/of groepen?
een onderdeel valt in een groep en als de gebruiker iets wilt aanpassen in dat onderdeel heeft ie dus wijzig rechten nodig op die groep.

Je krijgt dus een kopeltabel welke gebruikers aan groepen koppelt en heeft daarnaast nog een extra veld welke de rechten voor die combinatie aangeeft.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Ik noem token based omdat dat vrijwel één op één over te zetten is vanuit zijn huidige systeem, mits goed gewrapt. :)

'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!

  • Icey
  • Registratie: November 2001
  • Laatst online: 17-09 16:46
Jullie hebben gelijk, normaal gebruik ik inderdaad een koppeltabel maar ik kwam bovenstaande oplossing ergens tegen en dat leek eigenlijk veel makkelijker toe te passen. Niet stil gestaan dat ik dus (en zo snel) tegen deze limieten aan ga lopen. Ik denk dat ik maar een 'fail'-postit op mijn monitor ga plakken en de rest van de dag huilend in een hoekje ga liggen.

Tijd om dus terug te gaan naar het oude en vertrouwde systeem... Ondanks alles toch iedereen bedankt voor de duidelijke (en snelle) reacties :).

Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Of anders gewoon Acces control list? Zend heeft een goeie class daarvoor... http://framework.zend.com/manual/en/zend.acl.html

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Icey schreef op donderdag 29 oktober 2009 @ 10:56:
In de database heb ik de rechten opgeslagen;

IDRechtBit
1X lezen2
2X schrijven4
3X wijzigen8
4X verwijderen16
Overigens een niet meer zo relevante opmerking omdat je je systeem toch al moet omgooien, maar de kolom "bit" is nogal een foute benaming. Bits tellen namelijk gewoon van 0 tot het aantal bits. Wat jij bedoelt is de "bitmask" of gewoon simpelweg "mask". Oftewel, als je het hebt over bit 4, dan heeft die meestal de mask 24 = 1 << 4 = 16. :)

Overigens is de standaard manier om meer bits kwijt te kunnen dan in een int past gewoon arrays gebruiken van int, en geen bigint constructie oid, want die zijn om mee te rekenen. Al zou ik in PHP gewoon strings gebruiken (waarbij elke char 8 bits zijn), gezien het feit dat die contiguous opgeslagen zijn, itt daadwerkelijke PHP arrays wat eigenlijk hashtables zijn.

[ Voor 18% gewijzigd door .oisyn op 29-10-2009 13:08 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Je zou ook nog je bit-rechten kunne splitsen - ipv een bit gebruiken om 'X lezen' te definiëren kun je een bit "lezen" doen, dat combineren met een identifier voor X.

btw, je hebt dit toch niet toevallig van mijn blog gehaald? heb ik ook eens wat over geschreven, :+.

Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 17-09 16:46
.oisyn schreef op donderdag 29 oktober 2009 @ 12:59:
[...]

Overigens een niet meer zo relevante opmerking omdat je je systeem toch al moet omgooien, maar de kolom "bit" is nogal een foute benaming. Bits tellen namelijk gewoon van 0 tot het aantal bits. Wat jij bedoelt is de "bitmask" of gewoon simpelweg "mask". Oftewel, als je het hebt over bit 4, dan heeft die meestal de mask 24 = 1 << 4 = 16. :)
Oorspronkelijk had ik ook een wat andere kolomnamen, maar die tabel was een eenvoudig voorbeeldje om mijn situatie te verduidelijken :).
YopY schreef op donderdag 29 oktober 2009 @ 13:06:
btw, je hebt dit toch niet toevallig van mijn blog gehaald? heb ik ook eens wat over geschreven, :+.
Ooit eens ergens op een PHP website gelezen, in mijn hoofd opgeslagen maar jaren niks meer mee gedaan. Blijkbaar heb ik belangrijke details daarbij over het hoofd gezien ;).

[ Voor 24% gewijzigd door Icey op 29-10-2009 13:17 ]


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
mja, de theorie zit heel leuk in elkaar (ook aangezien je hiermee slechts 1 veld per gebruikersgroep nodig hebt om alle toegangsrechten toe te kennen, ipv een tabel, koppeltabel etc), maar je zit gewoon met die limiet.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

YopY schreef op donderdag 29 oktober 2009 @ 14:01:
mja, de theorie zit heel leuk in elkaar (ook aangezien je hiermee slechts 1 veld per gebruikersgroep nodig hebt om alle toegangsrechten toe te kennen, ipv een tabel, koppeltabel etc), maar je zit gewoon met die limiet.
@het dikgedrukte deel: da's een beetje een non-argument, he? Als ik in plaats van een koppeltabel mijn waardes ook comma separated op ga slaan in mijn database dan is dat ook slechts één veld, maar ik denk niet dat ook maar iemand zich er hier aan zal durven wagen om dat een goeie oplossing te noemen. :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!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Comma separated values in een database is een goede oplossing! :+




Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

YopY schreef op donderdag 29 oktober 2009 @ 14:01:
mja, de theorie zit heel leuk in elkaar (ook aangezien je hiermee slechts 1 veld per gebruikersgroep nodig hebt om alle toegangsrechten toe te kennen, ipv een tabel, koppeltabel etc), maar je zit gewoon met die limiet.
Maar wat is er heel leuk of handig aan dan? Kun jij met één overzichtelijke query een lijst genereren van alle gebruikers die toegang hebben tot bitje nummer 5?

O dat kan wel :+

[ Voor 15% gewijzigd door CodeCaster op 29-10-2009 14:17 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe schreef op donderdag 29 oktober 2009 @ 14:04:
[...]

@het dikgedrukte deel: da's een beetje een non-argument, he? Als ik in plaats van een koppeltabel mijn waardes ook comma separated op ga slaan in mijn database dan is dat ook slechts één veld, maar ik denk niet dat ook maar iemand zich er hier aan zal durven wagen om dat een goeie oplossing te noemen. :P
De rechten-tokens per item van mijn eigen forum staan ook comma-separated in een enkel veld :Y). Vooral omdat ik er bewust voor heb gekozen om rechten-checks sowieso niet met sql queries op wil lossen, en het dan een stuk praktischer is om alle rechten voor 1 item in een enkele rij uit te kunnen lezen.

Overigens zie ik dat ik minder dan 64 tokens heb dus ik had er beter een set van kunnen maken :+

[ Voor 6% gewijzigd door .oisyn op 29-10-2009 14:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

.oisyn schreef op donderdag 29 oktober 2009 @ 14:16:
[...]

De rechten-tokens per item van mijn eigen forum staan ook comma-separated in een enkel veld :Y). Vooral omdat ik er bewust voor heb gekozen om rechten-checks sowieso niet met sql queries op wil lossen, en het dan een stuk praktischer is om alle rechten voor 1 item in een enkele rij uit te kunnen lezen.
Goed, maar da's 1) een bewuste keuze die jij als ervaren programmeur goed kan maken en 2) een pragmatische oplossing die quick 'n dirty het goeie resultaat geeft, maar daarmee nog niet per se de beste oplossing is. :+
Overigens zie ik dat ik minder dan 64 tokens heb dus ik had er beter een set van kunnen maken :+
Alleen maar als het aannemelijk is dat het áltijd minder dan 64 tokens blijven. :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.

Pagina: 1