[PHP/MYSQL] Uitgebreid rechten systeem

Pagina: 1
Acties:
  • 373 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
Ik ben voor een website een member systeem aan het ontwikkelen.

De standaarden, zoals user aanlaten maken, inloggen profiel wijzigen enzo heb ik allemaal al, dat is ook het makkelijkste.
Maar nu wil ik de rechten gaan bepalen waarna ik daarna die ga gebruiken voor de verdere website/forum.
Ik wil niet gaan werken met statussen voor users maar met groepen. En dan eigenlijk op de manier zoals in windows. Dus gebruiker a zit in groep nieuwsposters maar mag alleen zijn eigen nieuwsberichten bewerken/verwijderen, maar gebruiker b zit ook in de groep nieuwsposters maar die mag alle nieuwberichten editten, maar alleen die van zichzelf verwijderen. Ook moet het mogelijk zijn om 1 gebruiker meerdere groepen te laten bevatten, dus zowel nieuwsposter en collumnnist bijvoorbeeld en ook weer dat ik daarop rechten kan toepassen zoals lezen, schrijven, wijzigen.

Hoe kan ik dit het beste aanpakken en hoe verwerk ik dit in de code.

Ik zat zelf te denken om een tabel in mysql aan te maken waarin ik de groepen defineer en daarachter de rechten. Maar dan zit ik met het lezen, schrijven, wijzigen systeem wat ik niet meer kan aangeven en hoe kan ik beste aangeven dat users in meerdere groepen zitten.

Ik hoop dat ik beetje goed uitgelegt heb, zo niet hoor ik het graag probeer ik het goed uit te leggen zodat ik met jullie hulp het systeem kan gaan schrijven.

Ik wil geen systeem jatten, want ik wil er ook nog wat van leren.

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

zoek eens op rechten, bit en bitmask. dat zal je stukken verder helpen.

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Nu online

BCC

Rechten rollen systeem: Een user heeft een of meerdere rollen, een rol heeft een of meedere rechten.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
BCC schreef op dinsdag 29 mei 2007 @ 20:48:
Rechten rollen systeem: Een user heeft een of meerdere rollen, een rol heeft een of meedere rechten.
Ja ken het system van 1 op veel relatie wel, maar snap ff niet hoe ik moet beginnen. En hoe ik het moet verwerken in dbase en code.
Hoe ik het moet uitlezen vooral.

Ik kan wel tabel aanmaken met daarin
userid - nieuws posten - eigen bewerken - eigen wissen - alles bewerken - alles wissen
1 - 1 - 1 - 1 - 0 - 0
2 - 1 - 1 - 1 - 1 - 1

En dan uitlezen met nieuwsposten == 1 controleer of gelijk is anders error.

Maar dit is niet de juiste manier denk ik.

Weet iemand hier een goede handleiding, tutorial of klein voorbeeld van dat ik daarmee verder kan borduren.

[ Voor 7% gewijzigd door winux op 29-05-2007 21:00 ]


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Nu online

BCC

Toegespits op jouw situatie:
Rollen: nieuwsposter, collumnist, user

Rechten van bijvoorbeeld nieuwsposter:
id, responsibility_id, onderwerp, actie
1, 1, nieuws, read
2, 1, nieuws, write
3, 1, comments, *

etc. Inrichting van je rechten en rollen ligt een beetje aan de indeling van je applicatie. Ik zou zelf nooit werken met bitmasks omdat dat zeer onhandig is omdat als je applicatie groeit je columns moet toevoegen. En op het moment dat je 1000 columns hebt, ben je niet blij meer.

Je krijgt dan dus uiteindelijk 5 tabellen:
users
responsibilty (link tabel users, rolles)
roles
authorisations (link tabel roles, rights)
rights

[ Voor 79% gewijzigd door BCC op 29-05-2007 21:08 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

zoek eens hier op GOT in programming naar "RechtenSysteem" Ik gok zo dat je een aantal topics krijgt die jij nog niet hebt doorgelezen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
dusty schreef op dinsdag 29 mei 2007 @ 21:06:
zoek eens hier op GOT in programming naar "RechtenSysteem" Ik gok zo dat je een aantal topics krijgt die jij nog niet hebt doorgelezen.
Ja dat heb ik wel, maar ik ben gewoon niet slimmer. Ben bij Dit topic uitgekomen en dat is heel intressant vanaf jou. Omdat je daar per onderdeel cq forum aan kan geven wat iemand wel of niet mag.
Kan je me dat eens uitleggen, want snap het nog niet helemaal.
Het is niet dat ik niks zelf wil uitzoeken of wat.
Maar er zijn zoveel verschillende types van rechten systemen en ik wil gewoon een perfect systeem hebben wat ik voor me website kan gebruiken ook als hij eventueel over paar jaar enorm is gegroeid met allerlei modules erbij.

Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
BCC schreef op dinsdag 29 mei 2007 @ 21:05:
Toegespits op jouw situatie:
Rollen: nieuwsposter, collumnist, user

Rechten van bijvoorbeeld nieuwsposter:
id, responsibility_id, onderwerp, actie
1, 1, nieuws, read
2, 1, nieuws, write
3, 1, comments, *

etc. Inrichting van je rechten en rollen ligt een beetje aan de indeling van je applicatie. Ik zou zelf nooit werken met bitmasks omdat dat zeer onhandig is omdat als je applicatie groeit je columns moet toevoegen. En op het moment dat je 1000 columns hebt, ben je niet blij meer.

Je krijgt dan dus uiteindelijk 5 tabellen:
users
responsibilty (link tabel users, rolles)
roles
authorisations (link tabel roles, rights)
rights
Ik probeer het te begrijpen, maar gaat nog niet van een leije dakkie. FF kijken of ik het goed begrijp. Ik zet in tabel
users -> alle users (die is makkelijk).
roles -> de tabel daarboven
rights -> ??

Snap er dus nog niet veel van sorry :$

Acties:
  • 0 Henk 'm!

  • DizzyVacation
  • Registratie: November 2006
  • Niet online
Ik neem aan dat het zo bedoeld is:

Je hebt een user. Deze user is nieuwsposter, dit is zijn role. Bij de role nieuwsposter horen de rechten schrijven/editten van nieuwsberichten, deze rechten staan in de tabel rights.

Nu verwijs je in de user tabel naar nieuwsposter, en in de tabel roles onder nieuwsposter naar de bijbehorende rechten.

Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
Ja niet helemaal, ik ben er achter gekomen dat het beter is geen groepen te gebruiken maar rechten per sectie. Maar snap nog niet helemaal hoe ik dat beste kan aanpakken met de 1-2-4-8-16-32 enz. structuur.

En welke rollen ik moet aanmaken.

Heb naar stukje van dusty zitten kijken, maar snap het nog niet helemaal :(

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
De rollen die je wilt moet je natuurlijk zelf verzinnen.

Je kan een editor hebben, een redacteur, een newsposter, een gebruiker, een administrator.

Dan maak je een tabel rechten:
editor, kan die wijzigen? nee
editor, kan die verwijderen? nee
enzenz.

Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
Ja maar hoe is de tabel opgebouwd.

userid, module, action ?

in dit topic staat dat het mogelijk is om meerdere regels aan te maken.Volgens dat topic moet het mogelijk zijn om, bijv. forum 1 en 2 te modden maar forum 3 te bannen.

Zou het dan zo zijn:

userid, module, action
1 , forum1 , 4
1 , forum2 , 4
1 , forum3 , 0
1 , nieuws , 1

0 = geen toegang
1 = posten
2 = modificeren_eigen
4 = admin (dus alles)

dus in deze situatie zou hij dus forum 1 en 2 mogen modden, geband van forum 3 en nieuws mogen posten?

Ben ik zo op goede weg?

Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
iemand nog iedeeën?

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

Wil je 't zo als in je vorige reply?

Ik heb een user-role systeem ala wat megamind en ingmar zeggen.

Dus je hebt een tabel
Users
userID
username etc

een tabel
Roles
roleID
role

een tabel
Permissions
permissionID
permission

een tabel
role_x_perm
roleID
permissionID

een tabel
user_x_role
userID
roleID

dan heb je bijvoorbeeld de volgende permissions:
1,article.view
2,article.edit_all
3,article.edit
4,article.delete_all
5,article.delete

de volgende roles:
1,viewer
2,editor
3,admin

users:
1,thedane
2,winux

user_x_role
1,3
2,2

en role_x_perm:
1,1
2,1
2,3
2,5
3,1
3,2
3,3
3,4
3,5

wil je een nieuwe role die alleen mag verwijderen, dan krijg je dus in table role een nieuwe rij:
4,deleter

die koppel je dan in role_x_perm aan de delete functies:
4,4

en je geeft een user die role:
2,4

Eerst mocht je artikelen bekijken, je eigen artikelen editen en deleten.
Nu mag je alleen nog verwijderen.

Je kunt ook meerdere roles assignen:
2,1
2,2
(dat is in dit voorbeeld niet zinvol, maar als je meer permissies hebt kan 't handig zijn)

[ Voor 3% gewijzigd door TheDane op 31-05-2007 00:28 ]


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Mijn huidige systeem is ongeveer gelijk aan TheDane hierboven, met het verschil dat ik in principe een "role" als template rechten gebruik, waarbij ik dus de rechten van de groep copieer naar de gebruiker. Hierdoor kan ik dus mensen een specifiek recht weghalen, waardoor ze in principe wel de rol hebben, maar net niet alle rechten van die rol.

Uiteraard zal je dan ook een andere "search" moeten hebben die specifiek op bepaalde rechten kan zoeken, ik heb een user search waar ik kan aangeven welke rechten (AND/OR) iemand minimaal moet hebben, en deze users worden dan allemaal weergegeven.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

dusty schreef op donderdag 31 mei 2007 @ 01:43:
Mijn huidige systeem is ongeveer gelijk aan TheDane hierboven, met het verschil dat ik in principe een "role" als template rechten gebruik, waarbij ik dus de rechten van de groep copieer naar de gebruiker. Hierdoor kan ik dus mensen een specifiek recht weghalen, waardoor ze in principe wel de rol hebben, maar net niet alle rechten van die rol.

Uiteraard zal je dan ook een andere "search" moeten hebben die specifiek op bepaalde rechten kan zoeken, ik heb een user search waar ik kan aangeven welke rechten (AND/OR) iemand minimaal moet hebben, en deze users worden dan allemaal weergegeven.
hehe, grappig, dit was mijn eerste implementatie. Met inmiddels 75 permissies en 200 'administrators' die 7 verschillende rol-profielen hebben was dit toch iets te onoverzichtelijk -moeilijk te managen- dus vandaar de huidige situatie.

Overigens is het nog wel (technisch) mogelijk om individuele permissies aan gebruikers toe te kennen via een user_x_permission tabel. Erg vrolijk word ik er niet van, maar ja, soms denkt de klant dat ie zéér specifieke gevallen nodig heeft.

Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

Twee woorden: Bitwise operators!

Nieuws:
bekijken: 1
toevoegen: 2
bewerken: 4
verwijderen: 8
moderatie: 16

Constanten zijn dan bijvoorbeeld:
See = 1
Add = 2
Edit = 4
Remove = 8
Moderate = 16 (bijvoorbeeld modereren van reakties)

klein voorbeeld:
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
<?php
// constanten:
define("IS_Banned", 0);
define("CAN_View", 1);
define("CAN_Add", 2);
define("CAN_Edit", 4);
define("CAN_Remove", 8);
define("CAN_Moderate", 16);

// een user die is gebanned:
$banneduser = IS_Banned;

// een user met de rechten:
$user1news = CAN_View + CAN_Add + CAN_Edit;
$user1articles = CAN_View + CAN_Moderate;

// een andere user met de rechten:
$user2news = CAN_View;
$user2articles = CAN_View + CAN_Add + CAN_Edit + CAN_Remove;

// implementatie voorbeeld:
if ($user1news == IS_Banned) { die("je bent gebanned!"); }

if ($user1news & CAN_View) { // kan user1 nieuws-berichten bekijken?
  display_messages();
}

if ($user1news & CAN_Add) { // kan user1 nieuws-berichten toevoegen?
  display_add_news_controls();
}

// etc.
?>


Ook makkelijk in een database op te slaan.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Ciqniz schreef op donderdag 31 mei 2007 @ 10:51:
Twee woorden: Bitwise operators!
Opzich een leuke oplossing, maar op het moment dat je meer dan een paar permissies hebt moet je allerlei kunsten uit gaan halen. Bijv die bitmask opslaan in een string oid omdat het niet meer in een long past.

Wij hebben ook een rollen-permissies systeem waarbij een permissie in een rol verschillende statussen kan hebben: allow, unknown en deny. Een gebruiker of groep kan dan meerdere rollen hebben, evt. geerfd van bovenliggende groepen. Allow geeft aan dat een gebruiker met die rol de permissie heeft, unknown geeft aan dat de gebruiker die permissie niet heeft tenzij een andere rol allow heeft als status voor die permissie. Deny tenslotte is de sterkste status, als een permissie voor een bepaalde rol op deny is gezet heeft de gebruiker die permissie niet, ook als een andere rol allow heeft.

[ Voor 45% gewijzigd door NetForce1 op 31-05-2007 11:08 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

Als je niet zoveel kaas hebt gegeten van bitwise trouwens:

Met mijn voorbeeld gaan we van 1 tot 16.
Dus dan hebben we 5 bits (00000-11111=16.8.4.2.1=5 verschillende getallen, omdat we 5 rechten hebben).
Elke bit die geset is (00010, 2e bit geset) staat voor welke rechten beschikbaar zijn voor de user.
Je begint rechts van alle bits met 1, en gaat door tot links (1, 2, 4, 8, 16).
Wat de bitwise operator doet is eigenlijk kijken of een bepaalde bit (die 1-16) op 1 staat of niet.
Hebben we 17, en we willen weten of de gebruiker mag moderaten (16) dan kijken we dus of de meeste linkse bit (in ons geval) geset is of niet.

17:
code:
1
2
1  0   0   0  1
16 .   .   .  1


Is een moderator en mag berichten bekijken.
Dus, je kunt zien dat die bit op een 1 staat, die overeenkomt met 16.
Dus je zou kunnen zeggen, in het getal 17 komt 16 wel voor maar 8, 4 en 2 niet.
Bekijken mag ook als we dat later (of eerder) gaan controleren, want de eerste bit (1) staat ook op 1.
Zo kijkt de "&" (bitwise operator) of een bepaalde waarde (recht in jouw geval) voorkomt in de totale rechten-waarde van de gebruiker.

31:
code:
1
2
1  1   1   1  1
16 8   4   2  1


Mag alles, want alle bits zijn geset.

16:
code:
1
2
1  0   0   0  0
16 .   .   .  .


Mag alleen moderaten en niks bekijken (stel je eens voor he... lekker objectief moderaten!).

Dat dus.

Voordelen:
- Overzichtelijkheid (mits je het goed aanpakt in je code, zie voorbeeld om een idee te krijgen)
- Uitbreidbaarheid (nieuwe rechten toevoegen zoals de geweldige optie om berichten roze te verven is een enkele regel code):
PHP:
1
define("CAN_MakeMsgPink", 32);

- Managment (rechten zijn makkelijk af te pakken of bij te geven: rechten + nieuw recht waarde, rechten - recht waarde = klaar!)

Acties:
  • 0 Henk 'm!

  • xillius
  • Registratie: November 2001
  • Laatst online: 23-01-2022
Kijk eens naar
http://phpgacl.sourceforge.net/

Goede manier om rechten te beheren, maar jij blijft de persoon die het bedenkt / implementeerd. Dus je zal er nog steeds zeer veel van leren!!!
Dit is een tool welke een rechten systeem faciliteerd. Jij moet het uitdenken en in je code verwerken.

Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

NetForce1 schreef op donderdag 31 mei 2007 @ 11:03:
[...]

Opzich een leuke oplossing, maar op het moment dat je meer dan een paar permissies hebt moet je allerlei kunsten uit gaan halen, bijv die bitmask opslaan in een string oid omdat het niet meer in een long past.
Hoeveel rechten kun je hebben? Je kunt het alsnog redelijk verdelen, zoals in mijn voorbeeld.
En anders, wat dan nog? Het blijft de makkelijkste, meest makkelijk uit te breiden en meest overzichtelijke methode (imo)!

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 16:30

TheDane

1.618

Ciqniz schreef op donderdag 31 mei 2007 @ 11:10:
[...]


Hoeveel rechten kun je hebben? Je kunt het alsnog redelijk verdelen, zoals in mijn voorbeeld.
En anders, wat dan nog? Het blijft de makkelijkste, meest makkelijk uit te breiden en meest overzichtelijke methode (imo)!
Wij hebben momenteel 63 verschillende permissies. Daar gaan er nog zeker een stuk of 20 bijkomen.
2^83 = handig?

Acties:
  • 0 Henk 'm!

  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

TheDane schreef op donderdag 31 mei 2007 @ 11:30:
[...]


Wij hebben momenteel 63 verschillende permissies. Daar gaan er nog zeker een stuk of 20 bijkomen.
2^83 = handig?
Tja. Dat is inderdaad wel erg veel.
Het KAN wel, server heeft wel wat te doen :P Maar het kan wel...

Acties:
  • 0 Henk 'm!

Verwijderd

Ciqniz schreef op donderdag 31 mei 2007 @ 11:10:
Hoeveel rechten kun je hebben? Je kunt het alsnog redelijk verdelen, zoals in mijn voorbeeld.
En anders, wat dan nog? Het blijft de makkelijkste, meest makkelijk uit te breiden en meest overzichtelijke methode (imo)!
Het argument dat het overzichtelijk zou zijn slaat natuurlijk als een tang op een varken. Het is gewoon feitelijk onwaar. Welke implementatie je ook kiest, in je code kun je er altijd voor zorgen dat recht door een methode 'canModerate' wordt ondervangen. Daar gaat je overzichtelijkheids argument niet op want het is voor alle methodes van toepassing.

Sterker nog het is de meest onoverzichtelijke methode. In je datastore staat immers enkel een 'niet leesbaar' getal.
--------------------------------
ik zou het dus compleet normaliseren, desnoods door bepaalde type rechten te groeperen in apparte tabbellen.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

TheDane schreef op donderdag 31 mei 2007 @ 09:25:
[...]
hehe, grappig, dit was mijn eerste implementatie.
[..]
Grappig, mijn eerste was zonder rollen, daarna dus rollen erbij gezet, totdat er dus speciale medewerkers kwamen met speciale rechten en ik geen zin had om 20 verschillende rollen te definieren terwijl ze allemaal ongeveer dezelfde rechten hadden op 1 of 2 na. En dus voor de optie gegaan hierboven, vond de "Negative rights"-oplossing gewoon niet netjes genoeg. Maar ik kan dus wel iemand in een rol plakken en rechten afnemen, terwijl je als je specifiek op die groep zoekt ook wel de persoon terug krijgt (Al heeft hij een aantal rechten minder) :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • winux
  • Registratie: April 2003
  • Laatst online: 18-09 22:18
Ciqniz schreef op donderdag 31 mei 2007 @ 10:51:
Twee woorden: Bitwise operators!

Nieuws:
bekijken: 1
toevoegen: 2
bewerken: 4
verwijderen: 8
moderatie: 16

Constanten zijn dan bijvoorbeeld:
See = 1
Add = 2
Edit = 4
Remove = 8
Moderate = 16 (bijvoorbeeld modereren van reakties)

klein voorbeeld:
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
<?php
// constanten:
define("IS_Banned", 0);
define("CAN_View", 1);
define("CAN_Add", 2);
define("CAN_Edit", 4);
define("CAN_Remove", 8);
define("CAN_Moderate", 16);

// een user die is gebanned:
$banneduser = IS_Banned;

// een user met de rechten:
$user1news = CAN_View + CAN_Add + CAN_Edit;
$user1articles = CAN_View + CAN_Moderate;

// een andere user met de rechten:
$user2news = CAN_View;
$user2articles = CAN_View + CAN_Add + CAN_Edit + CAN_Remove;

// implementatie voorbeeld:
if ($user1news == IS_Banned) { die("je bent gebanned!"); }

if ($user1news & CAN_View) { // kan user1 nieuws-berichten bekijken?
  display_messages();
}

if ($user1news & CAN_Add) { // kan user1 nieuws-berichten toevoegen?
  display_add_news_controls();
}

// etc.
?>


Ook makkelijk in een database op te slaan.
Ik vind dit wel goede optie, maar kan ik nu gewoon in me database zetten
userid | Module | permission
1 | news | 2
1 | articles | 16
Pagina: 1