HanibalPi Geschrieben 15. Oktober 2012 Geschrieben 15. Oktober 2012 Hallo, ich bin neu hier und hoffe ihr könnte mir helfen. Ich hoffe ich habe die richtige Kategorie erwischt, falls nicht bitte verschieben. Ich programmiere zZ mit Zend Framework 2, aber das sollte nichts an dem Problem ändern. Ich will für ein größeres Projekt die ACL schreiben. Dabei sollen die Rollen nie global sein, sondern immer Context bezogen, das heißt irgendein User kann auf einer bestimmten Seite alle Rechte eines Admins haben, doch auf der nächsten wieder nur die eines Users. Hier mal folgendes EER was ich gerade aus dem Gedächtnis erstellt habe, hoffe es hat sich kein Fehler eingeschlichen. Meine gedachte Abfolge. 1. Dem User wird durch die UserId und dem Context (durch die ContextID) eine gewisse Rolle gegeben (in den dependencies). Wichtig ist das der Context aus dem Modul und dem Controller besteht. Jeder Context mit einer Id wird durch die refId in dependencies eindeutig zugeordnet. 2. Die Rolle (role) ist mit dem Rechten (permission) über eine Tabelle miteinander verknüpft. 3. Die Rechte sind eindeutig zugewiesen indem das Recht (action) mit dem Context verknüpft ist. 3.a. Diese Verknüpfung (roter Kreis) könnte man wegfallen lassen indem man jedes Recht (action) eineindeutig benennt. Beispiel.: User A will auf /profile(module)/editor(controller)/delete(action)/1213(id) zugreifen. Zuerst wird über /profile/editor die ContextId (in context) ermittelt. Durch die UserId von User A , die ContextId und die Id:'1213' wird eine bestimmte Rolle (für User A) zugeordnet. Falls diese Zuordnung nicht existiert, hat der User A logischerweise kein Recht darauf. Danach wird geschaut ob die Rolle von User A auch das Recht hat die delete-Action aufzurufen. Ist dieses Recht ('delete' da die Action 'delete' heißt) auf dem Context der Rolle zugewiesen, darf er es. Wenn nicht dann nicht. Puh das ist sehr schwer zu erklären. Hoffe man versteht was ich sagen will. So jetzt brauche ich eure Meinung bzw euer Wissen. Wie sieht es aus, wo hat diese Struktur ihre Schwächen? Wie kann man sie beheben? Mache ich es viel zu kompliziert, oder ist das ein guter Weg für solche eine Context-basierende ACL? PS.: Falls jemand eine bessere Bezeichnung von "context" einfällt darf er sich gern melden. mfg Hanibal Zitieren
flashpixx Geschrieben 15. Oktober 2012 Geschrieben 15. Oktober 2012 Mir ist jetzt noch nicht klar, wofür Du die Rollen brauchst, denn Du hast User und Context als n:m Verknüpfung und die Permission ist davon ebenfalls abhängig, für Dein Bsp würde der User A im Context X das Recht haben zu löschen. Denn da die Rechte letztendlich User- & Contextbezogen sind, brauchst Du nach meiner Auffassung keine Rolle, denn der User hat in Abhängigkeit zum Context unterschiedliche Rechte Hoffe ich verstehe das so richtig Zitieren
HanibalPi Geschrieben 16. Oktober 2012 Autor Geschrieben 16. Oktober 2012 Danke schonmal für die Antwort. Ist alles doof das zu beschreiben aber ich versuchs mal. Zu deiner Frage: Jein. Da der Context ja nur aus Modul+Controller besteht, können manche User auf dem Context alle Actions (bspw.: Show, Edit, Delete, Create) ausführen, andere dagegen wieder nur Show. Die Rollen brauche ich da es viele User geben wird die die selben Rechte haben. Für jeden User die Rechte einzeln einzustellen wäre zu mühsam, deshalb werden alle die selbe Rolle bekommen. Vll ist es besser zu verstehen wenn man die Rollen als Rechtegruppen sieht. Die Verknüpfung zwischen permissions und context kann man ja wie geschrieben wegfallen lassen, solang die Actions unterschiedlich heißen. Zitieren
flashpixx Geschrieben 16. Oktober 2012 Geschrieben 16. Oktober 2012 Vll ist es besser zu verstehen wenn man die Rollen als Rechtegruppen sieht. Genauso habe ich das auch verstanden. Vielleicht wird das am Bsp etwas klarer: Nehmen wir an User X hat Rolle Y, die ihm erlaubt ein delete zu machen. Jetzt kannst Du im System einfach prüfen, ob der User die Rolle hat, dann spielt aber der Context keine Rolle, da Du nur auf die Existenz der Rolle prüfst. Wenn Du aber nun innerhalb eines Context eben manuell für einen User z.B. noch zusätzlich das "create" Recht hinzufügst, dann überschreibst Du die globale Rolle mit einem lokalen Recht, d.h. aber Du brauchst letztendlich die Rolle gar nicht, da Du sie eh "lokal" überschreibst. In diesem Fall braucht der User eben delete & create Recht innerhalb eines Context, um den gleichen Sachverhalt nach zu bilden. Die Rolle ist somit überflüssig. Was mir als einzige sinnvolle Möglichkeit einfallen würde, dass Du den Context in die Rolle hängst, sprich Du hast z.B. die Rolle "darf verändern", was dann aus den Rechten "create", "delete" und "modify" besteht. Wenn Du nun der Rolle eben noch den Context mit gibst, würde sie im allgemeinen Fall alle 3 Rechte liefern, sobald aber ein bestimmter Context existiert kann, sie auch weniger Rechte liefern Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.