Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Ideales Rechte-System (https://boardunity.de/ideales-rechte-system-t862.html)

Nev 03.02.2006 09:05

Dein Rechte-System hat einen kleinen Hacken

Ein Mod kann alle Beirtäge in jeder Sektion bearbeiten bzw. löschen.
das wäre in meinen Augen ein Super-Mod

Ein Mod darf nur in seiner Sektion diese Rechte haben.

eBoy 03.02.2006 14:09

Die Rechte werden immer nur für einen Bereich bzw. eine Kategorie vergeben und kann man somit variieren. Ich bin mir momentan nur nicht ganz im klaren, wie die DB-Strukur dafür aussehen müsste...

eBoy 03.02.2006 14:51

Einmal gibt es eine module-Tabelle, in der die Zugriffsrechte für einen Bereich vergeben werden können, weitere Rechte werden dann getrennt davon nochmal für jede (Sub-)Kategorie bzw. Aktion des Moduls/ Bereichs vergeben.

Dazu sollte wohl eine Tabelle [MODUL]_rechte Tabelle exisiteren, die Spalten entsprechend der obigen Rechte besitzt und diesen wiederum werden dann Gruppen- und/ oder User-ID's zugeordnet.

Könnte das so funktionieren?

Nev 03.02.2006 14:58

Ich glaube, du solltest dir das ganze nochmal genau überlegen, auf was du dich da einlässt

So einfach wie du, dir das vorstellst, ist es ned.

Da müssen einige Sachen überdenken.

Warum sollte man ein Globales Recht auf eine Funktion legen, ausser wenn man sie gesamt Ausschalten will.

Du kannst die Beziehung Funktion - Recht nur auf die Gruppe oder auf den User legen.

eBoy 03.02.2006 15:22

Das eine wäre alle User- und Gruppen-ID's in eine Spalte schreiben (z.B. Komma getrennt) und dann wieder auseinandernehmen oder 2 Spalten je Recht (1* User, 1* Gruppe) anlegen.

In meinen Gedanken sieht das alles ganz doll aus, doch die Umsetzung (DB-Tabellen) ist da problematisch bzw ich habe dazu keine gute Idee.

@Nev:
Dein Rechtesystem habe ich nicht verstanden, weshalb ich nicht weiß, ob dieses einfacher oder besser ist als meine Idee.

Das Rechtesystem, das ich umsetzen will, sollte einfach nur Gruppen und auch Usern Rechte vergeben/ prüfen. Also Gruppen und/ oder Usern Rechte und Verbote für gewisse Bereiche geben. Verbote haben Vorrang. Berechtigungen werden ODER_Verknüpft

Verbot => IMMER verbot!
1+ Berechtigungen => true
0 Berechtigungen => false

Vergebe ich Rechte nur für Gruppen, dann habe ich später evtl sehr viele Gruppen, wenn einzelne/ wenige User zusammen die Rechte für einen Bereich haben sollen und alle anderen keinen Zutritt...

frolix 03.02.2006 18:40

Vielleicht hilft es dir, wenn du dir erstmal ein paar fertige Usermanagement-Systeme anschaust. Um das Prinzip der Rollen zu verstehen, wuerde ich folgende Klassen vorschlagen: http://www.phpclasses.org/browse/package/513.html . Das Package ist nicht so umfangreich und meiner Meinung nach leicht zu ueberschauen. Da kannst du auch sehen, wie die Tables aufgebaut sein koennten. Ansonsten gibt es auf phpclasses.org noch diverse andere Beispiele die man sich anschauen kann um ein Grundverstaendnis fuer eine moegliche Umsetzung zu bekommen.

Ich kann dir wirklich nur zu einem Rollen-Rechtesystem raten. Die Flexibilitaet die du dir damit schaffst, willst du irgendwann nicht mehr missen.

eBoy 03.02.2006 19:31

Ok, ich habe zwar oftmals Probleme mich in fremden Code einzuarbeiten, aber ich schau mit die Klasse mal an ;)

Kann mir jemand diese Klasse an xetolosch.arcor.de schicken, ich bin dort nicht angemeldet...

frolix 03.02.2006 19:53

Hier gibts die direkt zum Download: http://adnoctum.netfirms.com/products/auth/

Wie gesagt, ist nur ein Beispiel wie sich sowas umsetzen laesst. Aber der Code ist gut zu durchblicken. Da musst du dich nicht gross einarbeiten. Ich glaube da waren auch Beispiele dabei.

eBoy 06.02.2006 08:02

Momentan sehe ich immernoch die wenigsten Probleme mit einem gruppenbasierenden Rechtesystem.

- Aktionen besitzen Rechte (lesen, schreiben, editieren, ...)
- Diesen Rechten werden Gruppen zugeordnet (eindeutige Zahlen)
- Den Gruppen werden User zugeordnet (eindeutige Zahlen)

Geprüft werden diese dann mittels AND-Verknüpfung von benötigten Rechten und Gruppen über die eindeutigen Zahlen.

Dies ist das einzigste Rechtesystem, das ich umzusetzen verstanden habe. Ich werde mir auch weiterhin andere anschauen und überlegen, wie ich Userrechte noch integrieren kann.

bacon 07.02.2006 21:30

falls es noch nicht kam, es gibt da diese Doku vom Koehntopp über phplib. Da ist auch ganz gut erläutert, wie das auth-modul funktioniert, da kannst du dir vielleicht ein paar anregungen holen.

http://kris.koehntopp.de/artikel/phplib-deutsch/

eBoy 08.02.2006 08:37

Danke, muss ich mir mal anschauen ;)

Ist es ausreichend mit einem globalen bannen zu arbeiten, oder sollte man das für verschiedene Module getrennt lösen? Globaler Bann würde sich einfach realisieren lassen.

Hier die geplante Abfolge:
1.) User- und Gruppenrechte kombinieren
2.) notwendige Rechte für den Zugriff/ die Aktion holen
3.) Berechtigung prüfen (true oder false)
4.) Berechtigung wiederrufen wenn ein Verbot vorliegt
5.) Berechtigung wiederrufen wenn der User gebannt ist
return "true" oder "false"

Alternative andere Prüfreihenfolge:
=> liegt ein verbot vor oder ist der User gebannt? => Rechte nicht prüfen und direkt "false" zurückgeben


Welche der beiden Möglichkeiten haltet ihr für besser und sinnvoller?

frolix 08.02.2006 08:49

Mit Rollen einfach die jeweilige Rolle entziehen :)

eBoy 08.02.2006 09:00

Diese Rolle oder die Berechtigung soll ja nur zeitweise entzogen werden und nicht dauerhaft. Somit kann ich die normalen berechtigungen nicht entziehen, sondern diese nur als ungültig markieren. Dazu benötige ich evtl eine neue Spalte.
Globales bannen kann ich in der Mitglieder-Tabelle problemlos mit einer Spalte realisieren, während ich für das Bannen einzelner Module in der gesamten module-Tabelle eine Spalte hinzufügen muss, wo ich alle gebannten Mitglieder-ID's reinschreiben muss. Diese müsste ich dann wieder trennen und prüfen, ob die entsprechende User-ID dabei ist. Also mehr aufwand wie dies für einen globalen Bann notwendig wäre.

Einfachere Möglichkeiten werden gerne genommen ;)

frolix 08.02.2006 10:39

Also ich finde deine Rechtesystem ziemlich umstaendlich. Nicht nur von der Umsetzung, auch vom Handling. Wenn ich jemandem in einem Rollensystem einen Bereich, auch nur zeitweise sperren will, dann loesch ich seine entsprechende Rolle und wenn er wieder rein darf, dann bekommt er sie halt wieder. Einfacher gehts nicht. Die benoetigten Rollen lassen sich ganz simple in jedem Modul definieren und werden beim laden geprueft. Fertig. Globales Bannen ist genauso ueber eine Rolle moeglich, bzw. ueber eine Gruppe die entsprechende Rollen hat oder nicht hat und der der User zugeordnet ist.

eBoy 08.02.2006 14:50

1.) Dann erklär mir bitte mal jemand verständlich wie das mit Rollen funktionieren soll und, abgesehen von der Bezeichung, der Unterschied zu finden ist...
Ich meine auch die Umsetzung in DB-Tabelles!

2.) Es ist immernoch die Frage ob es Sinn macht, eine Bannung nicht ausschließlich global durchzuführen. Ein Spammer wird wohl sein Beitragsniveau nicht nach dem Modul ändern ;)

frolix 09.02.2006 12:42

1.) Hier wurden doch schon genug Links gepostet. Sowohl zum Prinzip als auch Beispielklassen. Da solltest du eigentlich alles finden. Tables brauchste in etwa folgende: users, groups, roles, users2groups, groups2roles verknuepft ueber die jeweiligen PKs.

2.) Ist halt die Frage wie flexibel du sein moechtest. Aber wenn du schon mit einem modularen System anfaengst moechtest du ja scheinbar recht flexibel sein. Also wuerde ich mich nicht von anfang an auf irgendwas festlegen.

eBoy 09.02.2006 14:29

Dann wahrscheinlich nochmal Users2Roles, damit man Usern auch direkt eine Rolle zuteilen kann.

Beeinflusst es die performance, wenn man in einer Spalte kommagetrennte Daten ablegt, diese zu einem array aufsplitten?
Also "mid1, mid2, mid3, mid4,..." zu einem Array wandeln
Oder habt ihr eine alternative Möglichkeit für mich?

svpe 09.02.2006 15:29

Du kannst auch serialize und unserialize verwenden. ob das schneller ist weiß ich nicht ;)

eBoy 09.02.2006 17:43

Komplett Editiert!!!


Meine aktuelle Umsetzungsidee sieht wie folgt aus:

- das Rechtesystem verarbeitet nur Gruppen
- Userberechtigungen müssen über virtuelle Gruppen ablaufen (Userrechte über virtuelle Gruppen, d.h. User mit Sonderrechten braucht eine eindeutige GID. Umsetzung noch unklar...)

Tabelle mit Rechten:
Code:

aktion#lesen#schreiben#edit#löschen#edit_alle#löschen_alle
aktion => entsprechender Bereich/ Aktion, für die die Rechte vergeben werden
lesen => aufaddierte GID's mit Leseberechtigung
schreiben => aufaddierte GID's mit Schreibeberechtigung
edit => aufaddierte GID's mit Editierberechtigung
löschen => aufaddierte GID's mit Löschberechtigung
edit_alle => aufaddierte GID's mit "alle editieren" Berechtigung
löschen_alle => aufaddierte GID's mit "alle editieren" Berechtigung

So, jetzt bekomm ich wieder die Verbote nicht unter... *g*
Bei den Verboten könnte ich entweder für eine "Aktion" (z.B. ein Board in einem Forum) vergeben, was einfach zu realisieren wäre. Will ich verbote getrennt für lesen, schreiben, editieren usw. vergeben will, müsste ich wieder für jedes dieser Rechte eine Spalte für die Verbote vergeben...

Die eindeutige virtuelle GID für Userrechte ist problematisch. Diese muss ja in die Folge der GID's passen und trotzdem eindeutig sein. Z.B. erst später anfangen. Dies würde die Anzahl der möglichen Gruppen begrenzen und diese virtuelle GID müsste dynamisch erzeugt werden.
Oder die User-Sonderrechte werden in einer eigenen Spalte verwaltet und serialisiert abgespeichert...


ich bastle mal an diesem Gedanken weiter und höre gerne eure Meinung dazu. Das durchdenken und eure Beiträge helfen mir die Unterschiede und Vor-/Nachteile zu verstehen ;)

Zitat:

Zitat von Aus einem anderen Forum... Dort habe ich auch dazu gepostet in einem bestehenden thread
Ich stimme axo voll zu. Ich bin auch nur hier gelandet, da ich ein rechtesystem schreiben will, das ebenfalls bitweise arbeitet Wink
Will das auch ungefähr so machen, wie oben beschreiben, muss mir nur überlegen, wie ich nicht nur Gruppenrechte, sondern auch Userrechte unterbekomme...

Habe schon überlegt, ob ich Mitgliedern mit eigenen Berechtigungen eine vituelle Gruppen-ID vergeben soll, damit diese Rechte wie eine weitere Gruppenmitgliedschaft verarbeitet werden.

[EDIT]
Ich vergebe verschiedene Rechte:
(- kein Zutritt => 0 // KEINE SPALTE!!!)
- lesen => 1
- schreiben => 2
- editieren (eigene) => 4
- löschen (eigene) => 8
- editieren (alle) => 16
- löschen (alle) => 32

In der DB mache ich dann für jedes dieser Rechte eine Spalte. zugeordnet werden diese Rechte einem Bereich oder einer Kategorie.

Dann vergebe ich jeder Gruppe eine eindeutige ID:
- 1. Gruppe => 1
- 2. Gruppe => 2
- 3. Gruppe => 4
...

In die Spalten der DB trage ich dann bei jedem Recht die berechtigten Gruppen ein (ID aufaddiert).
Also kann man durch bitweise verunden der Gruppenmitgliedschaften (ID's) und berechtigten Gruppen die Rechte erhalten.

So kann ich alle Berechtigungen für Gruppen erledigen, nun muss ich noch überlegen wie ich Verbote und Userrechte einbauen kann.
Globales Verbot (also für lesen, schreiben, editieren usw. ...) ist kein Problem, aber wie könnte ich nur lesen oder nur schreiben nehmen?
Verbote sollen Konflikte verhindern, wenn gewisse Gruppen keinen Zugriff haben sollen, aber durch eine andere Gruppe Zugriff erhalten

Irgendwelche Vorschläge?
[/EDIT]


bacon 12.02.2006 14:36

!? raff ich jetzt nicht, ist das auch deine Frage oder hat sichs erledigt? Es sagt ja schon, dass er das ganze über ne normale Bitfolge macht, die er nur noch verknüpfen muss.

Aber dann fragt er, wie er sich die korrekten Rechte rausholt, oder hab ich das jetzt falsch verstanden?

Also sagen wir mal, ein User hat das "Recht" 24.

24 = 16 + 8 = B 0001 0000 + 0000 1000. Da musste halt jetzt nochn Algorithmus schreiben, der dir das Ding auseinandernimmt, ich würde da spontan auf nen Bitoperator verweisen:

PHP-Code:


$b 
56// is 8 + 16 + 32, also 0011 1000

$c $b 2// liefert 0, da 2 = 0000 0010 nicht drin enthalten ist.
$c $b 16 // liefert 16, da 16  (0001 0000) enthalten ist.
... // und so weiter
echo $c

probier damit einfach mal rum, das ist eigentlich ganz einfach


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.

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