![]() |
Re: Baumstruktur mit Rechten
Zitat:
Zitat:
![]() ![]() |
Re: Baumstruktur mit Rechten
Eine Rechtvergabe per Rolle bedeutet nur, dass nicht eine Benutzer sondern eine Benutzergruppe das Recht zugeordnet bekommt.
Um das Prinzip um Rechte zu erweitern bedraf es einen Join auf die Rechtetabelle, dann fliegen die Äste ohne Recht raus |
Re: Baumstruktur mit Rechten
Zitat:
![]() |
Re: Baumstruktur mit Rechten
Danke für die weiteren Antworten...
Ich glaube ich leg mal los und bastel mir einen Entwurf. Den können wir ja dann immernoch diskutieren. @omata: Deine SP ist mir zu monströs: Zwei Temporary Tables und wenn ich mich nicht irre zwei Verfahren die den Nested Sets "eher ![]() |
Re: Baumstruktur mit Rechten
Zitat:
Schade, das hier immer der interresante Gedanke, der sich hinter dieser Thematik und Vorgehensweise verbirgt nicht erkannt wird. Das hier zwei Temporäre Tabellen zum Einsatz kommen, liegt leider an der primitiven Art, wie MySQL mit INSERT-Statements argieren kann. Der von dir angegebene Links stellt leider nur eine minimalistische Sicht der Dinge dar, wenn dir das reicht und du das erziehlen kannst, was du benötigst, ist das ja ausreichend. Viel Erfolg bei der Umsetzung. |
Re: Baumstruktur mit Rechten
Zitat:
Nach den Weihnachtstagen werde ich mal meinen Ansatz posten. Bis dahin... und Frohe Weihnachten! :xmas: |
Re: Baumstruktur mit Rechten
Liste der Anhänge anzeigen (Anzahl: 1)
So...
Ich hab mir nochmal ein par Gedanken gemacht aber ich bin immer noch nicht zu einer zufriedenstellenden Lösung gekommen. Ich habe daher mal meine Idee in ein Bild gefasst (siehe Anhang). Nun zu meinem Ansatz: Die Knoten landen alle in einer Tabelle, wobei zu jedem Knoten der Parent gespeichert wird. Zum Ausgeben kann ich dann einfach alle Knoten aus der DB lesen und nach ihrem Parent sotiert in Arrays packen und ausgeben. Die Zugriffssteuerung (hier geht es um einen seperaten Verwaltungsbereich indem der Zugriff eingeschränkt werden soll) wollte ich mit einer Entity Rechte lösen, die die Ensprechenden Rechte-Attribute besitzt sowie ein Attribut ob das Recht vererbt werden soll. Um diese Rechte nun mit den Knoten zu verbinden dachte ich an eine Relation die zusätlich eine Information enthält von welchem Knoten aus das Recht ggf. geerbt wurde. Die Rechte werden dann über den vorgeschlagenen Zwischenschritt der "Rolle" einem Benutzer zugeordnet. Das ganze soll das so funktionieren: Jedem Knoten können verschiedene Rechtedatensätze zugewiesen werden, die ggf. kombiniert werden. Füge ich einen Knoten ein, wird vorher beim Parent geprüft welche vererbten Rechte dieser besitzt und die Rechte werden direkt auch mit dem neuen Knoten verknüpft. Wird die Vererbung aufgehoben, werden anhand des Quell-Attributs der Relation einfach die vererbten Verknüpfungen aufgehoben. Einzig das aktivieren der Vererbung bei vorhandenen Unterknoten ist Problematisch. Meine Idee: Entweder das Neted-Set-Modell anwenden, sodass alle Unterknoten mit einer Abfrage ermittelt werden können, oder eine rekursive Stored Procedure. Nun stellt sich mir natürlich die Frage ob dieser Ansatz überhaupt brauchbar ist? Ich habe so etwas noch nie gemacht und denke mir fehlt da etwas der Durchblick. Ich bin für jeden Rat dankbar! |
Re: Baumstruktur mit Rechten
Keiner einen Kommentar? *push* :duck:
P.S.: So wie es ausshieht ist eine rekursive SP unter MySQL gar nicht möglich... :( |
Re: Baumstruktur mit Rechten
Moin,
ich verwende momentan ein aehnliches System in meinen Applikationen und habe es so geloest: Es gibt eine Tabelle, in der das Nested Set definiert ist - das kennst du ja bereits. Es gibt nun eine weitere Tabelle, welche auf Gruppenbasis (auch Benutzer sind Gruppen) Rechte zuweist. Dabei gilt: wenn nichts da ist, darf der Benutzer gar nichts. Ich lese nun als erstes mit einem Query alle IDs aus, die der Benutzer sehen darf (natuerlich in Abhaengigkeit seiner kompletten Benutzergruppen, das ist ein etwas haessliches Dingen). Anschliessend speichere ich es folgendermassen im Array:
Code:
Diese Loesung hat schonmal den Vorteil, dass du nicht mit in_array() pruefen musst sondern mit isset(), was natuerlich schneller funktioniert.
while ($row = $db->fetchrow($result)) {
$allowedNodes[$row['id']] = true; } Anschliessend hol ich mir das Nested Set raus:
Code:
Hier verwende ich nicht eine Beschraenkung auf die ID, denn ein Benutzer soll ein Child nicht sehen, wenn er den Parent nicht sehen kann - egal wie die Zugriffsrechte aufs Child sind.
$sql = 'SELECT * FROM nested_set ORDER BY left_id ASC';
$result = $db->query($sql); In einer Schleife pruefe ich dann die ganze Sache:
Code:
Wenn ich nun auf einen Node stosse, welchen der Benutzer nicht sehen darf, speichere ich mir die Right-ID und ueberspringe saemtliche Nodes, deren Right-ID kleiner ist als die gespeicherte (die also unter diesem "unsichtbaren" Node liegen). Sobald ich auf den folgenden Node treffe, loesche ich die gespeicherte Right-ID wieder und arbeite normal weiter.
$treeNodes = array();
while ($row = $db->fetchrow($result) { if (isset($rightID)) { if ($row['right_id'] < $rightID) { continue; } else { unset($rightID); } } if (!isset($alloowedNodes[$row['id']])) { $rightID = $row['right_id']; continue; } // Restliche Verarbeitung $treeNodes[] = $row; } Mein Tipp: lass die Finger von rekursiven Dingen bei solchen Strukturen. Sobald der Baum groesser wird wirds richtig haesslich, und selbst bei kleinen Baeumen bombardierst du den Server mit Queries, fuer die er bei MyISAM erstmal die ganze Tabelle sperrt. Da kanns dann ganz schoen heiss hergehn ;) Greetz alcaeus |
Re: Baumstruktur mit Rechten
Vielen Dank für die ausführliche Antwort!
Deine elegante Lösung hat mich überzeugt: Ich werde Nested Sets verwenden... Nun würde ich meine Rechte noch gerne vererben. Es gäbe ja die Möglichkeit den "Rechte-Datensatz" nur einemal mit einem Knoten zu verknüpfen und dann bei der Verarbeitung des Baumes sich die Rechte zu "merken" und auf die Unterknoten anzuwenden, oder das vererbte Recht direkt mit allen Unterknoten zu verknüpfen, wie ich es bis dato in etwa angedacht hatte (siehe #17). Ich sehe die Vor- und Nachteile beim Zugriff: Werden oft einzelne Knoten nachgfragt sollte die direkte Verknüpfung besser sein (man muss nicht den ganzen Baum verarbeiten) - werden aber oft neune Knoten eingefügt und wird die Struktur oft verändert (ergo viele seperate Verknüpfungen müssten verändert werden) sollte das anwenden der Rechte bei der Verarbeitung besser geeignet sein, oder? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz