![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 561
|
Tag, da ich nun bald bei meinem Projekt an eine Stelle komme, an dem ich eine Rechteverwaltung brauch, wollte ich hier mal fragen, wie ich dies am besten löse. Folgende Aufgabenstellung hab ich mir gegeben: Von Anfang an wird es 4 Gruppen geben:
Simple abfragen wie isAllowedTo('moderate_forum') oder so wären an sich schon möglich, aber ich nehme mal an, dass es noch bessere Möglichkeiten gibt, deshalb frage ich auch erstmal nach, bevor ich mich durch ettliche bereits fertige Systeme schlage und mir dort etwas zusammensuche. Mal ein Einwand, der auch gerne komplett gestrichen werden kann, wenn er Schwachfug ist: Gibt es nicht auch irgendwie eine Möglichkeit, das "bitweise" zu berechnen? Ich habe mal über einen Artikel drübergeflogen (ist leider schon länger her), in dem die Rechte irgendwie mit dem & Operator geprüft wurden, und auch in einer anderen Art und Weise in der MySQL Datenbank abgelegt wurden (nicht mit dem Flag 0 und 1 sondern 0001001, was dann eben bestimmte Rechte bedeutet hatte) .. ? Den Artikel hab ich nicht mehr, sonst hätte ich da ja nachlesen können. Vielen Dank für die Antworten im Vorraus ..
__________________ http://www.ChrisDiary.De |
| | |
| | Nach oben #2 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Ich bevorzuge dynamische Rechtevergaben, sprich: Du hast eine Verknüpfungstabelle, die deine definierten Rechte-IDs mit den User-IDs verknüpft. Existiert also die Verknüpfung, dann darf er das auch. Existiert sie nicht, darf er es nicht. Damit hast du jederzeit die Möglichkeit, deine Rechte zu erweitern, ohne, wie bei der "bitweisen" Methode, beim Erstellen eines neuen Rechts die alten Rechte"bits" um eine Stelle zu erweitern.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #3 | |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 561
| Zitat:
Nun, wie sehen denn dann die Rechte-IDs aus? Ist jedem Recht (z.B. threads zusammenführen, bearbeiten) .. eine unique Rechte-ID zugewiesen?
__________________ http://www.ChrisDiary.De | |
| | |
| | Nach oben #4 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Die Tabelle für die Rechte würden aus ID (Primary Key) und Name bestehen, wobei auch der Name fürs bessere Programmieren Unique sein sollte. Sprich du cached die Rechte in der Session und fragst dann nur, ob $_SESSION['rights']['rechtename'] existiert und kannst damit verständlicher arbeiten als dauernd in der Doku nachschauen zu müssen, welche Nummer welches Recht darstellt.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #5 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Hi. Ich benutze gerade Controller mit mehreren Action-Methoden. Jeder solchen Methode kann eine eigene Methode beigeügt werden, die, falls sie eben vorhenden ist, die Rechte prüft und true oder false zurückgibt. Das passt für sehr spezielle Anforderungen allemal, gibt aber sicher universellere Möglichkeiten. Dass man z.B. in der DAtenbank für jedes Modul bestimmte Aktionen anlegt und diese den Benutzern/Gruppen etc. zuornet. Aber so wirklich durchgestiegen bin ich da auch noch nicht. Oft sieht es ja so aus, dass, z.B. zum Ändern eines Objektes einmal der Besitzer das Recht hat, dann der Redakteur, der sich dessen angenommen hat und dann der Admin. Hab noch nicht raus, wei sich das einheitlich beschreiben ließe - daher eben auch die Methoden, in denen "manuell" geprüft wird, wem das Objekt gehört und welche Rollen der Benutzer in welchen Gruppen hat. Das Manual von phpGACL ist auch kein schlechter Einstieg (zumindest, wenn du auf Star Wars stehst). Basti PS@"WarrenFaith": Meine PM nicht bekommen? |
| | |
| | Nach oben #6 | ||
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 561
| Zitat:
Zitat:
__________________ http://www.ChrisDiary.De | ||
| | |
| | Nach oben #7 | |
| Jonas Registriert seit: 03.06.2006
Beiträge: 239
| Zitat:
Wie Verknüpfe ich denn die Rechte mit dem User am besten? Bisher ist meine Überlegung so: Code: table "rights" id | name ---+------------------- 1 | "create_root_node" 2 | "edit_root_node" 3 | "delete_root_node" Code: table "users" id | rights ---+-------- 1 | "1,2" 2 | "1" 3 | "1,2,3"
__________________ Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL | |
| | |
| | Nach oben #8 |
| Blubb... öfz Registriert seit: 16.03.2006 Ort: Berlin
Beiträge: 419
|
Warum extra in einen String packen? einfach 1,2,3,4,5 oder 1|2|3|4|5 oder sonst ein Seperator. Kannst mit Explode dann gaaaaaaaaanz einfach trennen
__________________ Vive la France! Welcome to Sarkoworld... |
| | |
| | Nach oben #9 |
| Jonas Registriert seit: 03.06.2006
Beiträge: 239
|
Genau das was du vorschlägst habe ich doch bisher - die Rechte-IDs mit einem Komma getrennt. Oder versteh ich dich nicht? Was ich mit der Frage (Oder ist die Idee mit dem String völlig Banane?) meinte ist, ob es für so etwas einen besseren MySQL-Datentyp, oder Ansatz gibt.
__________________ Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL |
| | |
| | Nach oben #10 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Es gibt einen MySQL-Datenformat, welches mehrere Zustände in einem Datensatz unterstützt, allerdings müsstest du zur Erweiterung die Struktur der Tabelle dazu ändern. Abgesehen davon wollte ich mal darauf hinweisen, dass die Art und Weise, in dieser Form die Daten in eine Datenbank zu speichern nicht den Normalformen entspricht, die da besagt, dass keine multiplen Daten in einem einzelnen Feld gespeichert werden sollen. Vielmehr würde es mehr Sinn machen, eine extra Tabelle anzulegen, in der die einzelnen Werte gespeichert werden. So wurde es ja auch von Warren gemeint. Aussehen wird es dann wie folgt: Code: table "user" id | name ---+-------- 1 | "User1" 2 | "User2" 3 | "User3" table "rights" id | name ---+-------- 1 | "Right1" 2 | "Right2" 3 | "Right3" table "user_rights" user_id | right_id ---+-------- 1 | 3 2 | 1 3 | 2 Um nun alle Rechte der User2 auslesen zu können, benötigt man nun lediglich die ID des Benutzers (in diesem Beispiel die 2 Code: SELECT `r`.`name` FROM `user_rights` AS `ur` LEFT OUTER JOIN `rights` AS `r` ON `r`.`id`=`ur`.`right_id` WHERE `ur`.`user_id`='2' Ich hoffe ich konnte ein wenig Licht ins Dunkle bringen!?
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #12 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Kommt halt daruf an, was man vorhat. Wie in dem phpGACL-Tutorial schön beschrieben, kmmt man halt nicht besonders weit, wenn man einfach nur Rechte und Benutzer hat. Das geht bei ein paar Benutzern ganz gut, wird aber schnell nicht mehr verwaltbar. Mir taugt da folgendes System: Es gibt unterschiedliche Gruppentypen. Für jeden Gruppentyp können verschiedene Rollen definiert werden. Jede Gruppe ist von genau einem Gruppentyp und ein Benutzer kann nun eben in allen möglichen Gruppen in die Rolen schlüpfen, die durch den Gruppentypen vorgegeben sind. Damit kan ich eben sagen, dass an der Stelle nur Administratoren der Besitzer-Gruppe einer Seite oder Moderatoren und Administratoren der globalen Gruppe eine neue Unterseite einfügen dürfen etc. Das ließe sich nur mit Benutzern nicht handeln! Basti |
| | |
| | Nach oben #13 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
MrNiceGuy hat also mein Post gut dargestellt. Nur als Zusatz: Wenn ein User mehrere Rechte hat, dann werden die nicht zusammen in einen String geschrieben sondern ein neuer Eintrag erzeugt. Code: table "user_rights" user_id | right_id ---+-------- 1 | 3 2 | 1 3 | 2 3 | 1 Das gleiche geht mit den Gruppen.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #14 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
@Basti: Natürlich kommt es darauf an, was man machen will, deine beschriebene Methode ist ja auch lediglich eine erweiterte Darstellung von dem System, was Warren "prädigte" und ich nochmal in einem kleinen Beispiel darstellte, das Prinzip ist jedoch das Gleiche.
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #15 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Jein. Das Ding ist halt, dass du bei einem Mapping Benutzer <-> Recht eine einfache Verknüfpung hast, in der keine Konflikte auftreten (höchstens durch die Art, welche Rechte es gibt selbst). Wenn du nun mit Gruppen hantierst kann das auch kein Problem sein, wenn du die Rechte einfach nur "addierst". Kann aber auch darauf rauslaufen, dass es nicht reicht, einfach nur zu definieren: Die Gruppe oder die Rolle hat dieses Recht: ja oder nein. Und, was spricht gagegen, eine gute Darstellung zu erweitern? Und, welches Prinzip meinst du? Wie man eine n:m-Relation abbildet? Jo, da gibts nicht viel Spielraum. *g Basti |
| | |
| | Nach oben #16 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Wir haben uns im Beispiel nur auf Nutzer - Rechte bezogen, das stimmt. Allerdings ist eine Erweiterung auf Gruppen leicht erweiterbar. Letzten endes meinem wir drei das gleiche, nur kommen aus einer anderen Richtung auf das Thema zu. Zusammenfassend kann man das Beispiel von MrNiceGuy um Gruppen erweitern, wenn man will kann man sogar Rollen dazu definieren (um z.B bei 300 Rechten leichter einen Moderator alle notwendigen Rechte per Rolle zu geben und nicht jede der 300 Rechte per Hand definieren muss). Das ist letzten endes aber nur eine Umsetzung auf SQL/PHP Basis die erfolgen muss. Die Logik dahinter sollte klar sein.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #17 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Wie gesagt: Wenn du nur Benutzer auf Rechte abbildest, dann gibt es keine Konflikte, die du lösen musst. Wenn ein Benutzer aber in zwei Gruppen ist und die eine Gruppe hat das Recht Aktion A durchführen, die andere nicht, dann gibt es einen Konflikt, der bei dieser Erweiterung neu ist und der gelöst werden muss. Im einfachsten Fall kannst du definieren: Wenn ein Benutzer in mindestens einer Gruppe ist, die das Recht hat, Aktion A durchzuführen, dann darf er diese durchführen, auch wenn er ev. in anderen Gruppen ist, die keine Erlaubnis haben, das zu tun. Damit kommt man ja auch schon sehr weit. Aber man muss den Konflikt eben sehen und sich für eine Lösung entscheiden. Bei den hier vorgestellten vier Gruppen fällt eine Entscheidung nicht schwer, da diese wahrscheinlich hierarchisch angelegt sind, so dass die jeweilige Gruppe "drüber" einfach nur Rechte dazu bekommt. Was ich sagen wollte: Das ist keine "lineare" Erweiterung (das wäre der Fall, wenn man prüfen wolle, ob eine Gruppe ein Recht hat - man fragt in der Regel aber, ob der Benutzer, der in mehreren Gruppen sein kann, ein Recht hat), sondern bringt einen neunen Aspekt mit sich. Ist aber - glaube ich - jetzt auch genug zerkaut... *g Basti |
| | |
| | Nach oben #18 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| Da möchte ich gerne wiedersprechen, denn letztlich ist genau das eine einzige SQL Abfrage. Letzlich wichtig ist die von die genannte Entscheidung, ob bei mehreren Gruppen es reicht, wenn eine das Recht hat. Dazu müsste man dann vielleicht Gültigkeiten für einzelne Rechte aufweisen. So z.b. darf ein Mod ja nicht überall moderieren, sondern nur dort, wo er den Posten bekleidet. Dafür bräuchte man definitiv eine Einschränkung der Rechte.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #19 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Konkret: * Jedes Forum kann 0-n Moderatoren haben. * Jeder Benutzer kann Moderator in 0-n Fore sein. * Jeder Moderator eines Forums hat das Recht, Beiträge darin zu editieren. * Ferner darf jeder Benutzer seine eigenen Beiräge edtieren. Hat also der Benutzer das Recht, einen Beitrag zu editeren? Ja, wenn er entweder der Autor des Beitrags ist, oder wenn er ein Moderator des Forums ist, in dem der Beitrag geschrieben wurde. Auf diese Weise kannst du auch pauschal die Rechte aller Moderatoren verändern. Wie das allerdings geschickt "pauschal" abgebildet werden kann, weiß ich (noch) nicht. Ich mach die Anfragen wie geschieben eben immernoch von Hand: PHP-Code: Basti Geändert von Basti (18.10.2006 um 14:19 Uhr). | |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Book Review: PHP and MySQL by Example. | Ben | Literatur | 0 | 06.01.2007 23:11 |
| [Linux] LAMP Tutorial - Installation von Apache, MySQL und PHP unter Linux | Corvin | Tutorials | 6 | 17.04.2006 22:13 |
| Simpler PHP 4/5 Webspace mit Mysql | Buhmann | Gesuche | 11 | 07.02.2006 09:19 |
| Flash -> PHP -> MySQL | thrawn | Sonstige Programmiersprachen | 8 | 02.02.2006 18:10 |
| [PHP] Erstellung und Bearbeitung von Bildern mittels PHP | WarrenFaith | Tutorials | 1 | 23.08.2005 15:30 |