Ankündigung

Einklappen
Keine Ankündigung bisher.

Best Practices Benutzerverwaltung

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Best Practices Benutzerverwaltung

    Hallo!
    Ich dachte ja immer es wäre eine gute Idee ein Rechtesystem zu schreiben, dass auf dem binären Zahlensystem aufbaut, doch wurde ich ja nun eines Besseren belehrt und möchte mich daher an die Entwicklung eines neuen Systems setzen. In dem Thread, in dem ich mein Binäres Rechtesystem vorgestellt hatte, wurden ja schon einige Alternativen genannt, wie ich ein solches System aufbauen könnte.

    Eine Möglichkeit wäre natürlich alle Rechte eines Nutzers in eine Spalte rights in die Usertabelle zu schreiben und einfach durch Kommata zu separieren. Das halte ich bei großen Systemen für eine absolut unübersichtliche, Performance fressende und vorallem schlecht zu händelnde Variante.

    Manko 10 hatte da denke ich schon eine deutlich bessere Alternative. Seine Idee war es drei Tabellen für die User, die Rechte (oder geschützten Bereiche) sowie eine Tabelle in der diese Zusammengeführt werden, also die Benutzer bezogenen Rechte (Permissions), zu erstellen. Auf diese Weise könnte man relativ einfach Module hinzufügen oder auch entfernen.

    Schön fand ich auch die Idee von dr.e das ganze über Beziehungen zu regeln. Allerdings halte ich diesen Ansatz für etwas zu komplex. Man könnte an dieser Stelle vielleicht ansetzen und anstatt mit tausenden Tabellen mit Nested Sets arbeiten. Käme mir auch ganz geöegen, da ich mich bereits mit diesem Thema beschäftigt habe.

    Ich würde jetzt auf der Idee von Manko 10 aufbauen und eine drei Tabellen Struktur aufbauen. Doch anstatt einer Tabelle, in der nur die existierenden Bereiche gespeichert sind, würde ich eine Tabelle einfügen, die auf Nested Sets aufbaut. Durch die Baumstruktur ist es nun sehr einfach möglich Rechte zur Verarbeitung eines, eines Bereichs oder allen Artikeln zu vergeben. Zudem kann man duch die Baumstruktur auch sehr sehr einfach verschiedene Navigationen von einander trennen, diese Navigationen individuell sortieren, weitere Module einbinden oder eine Sitemap erstellen lassen.

    Was haltet ihr von einem solchen Ansatz? Gibt es Anregungen, Fragen oder weiterführende Ideen? Freue mich über jede Wortmeldung.
    MfG, Andy


  • #2
    Hallo #Avedo,

    für ein reines Benutzer-Management reicht dir auf das folgende UML: Adventure PHP Framework - Generischer OR Mapper. Damit solltest du alle weiteren Themen erschlagen können.

    Nested Sets ist eine Möglichkeit hirarchische Strukturen (Bäume) abzubilden, sind für meine Begriffe jedoch hier nicht nötig.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design before you start to write code!
    2. Discuss and review it together with experts!
    3. Choose good tools (-> Adventure PHP Framework (APF))!
    4. Write clean and reusable software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Das es gute Lösungen bereits gibt ist mir bekannt. Allerdings möchte ich selbst eine Lösung finden, da ich, um mene PHP-Kenntnisse zu erweitern, ein eigenes kleines CMS schreiben möchte. Das wird wahrscheinlich nie jemandem außer mir helfen, aber es ist eine gute Übung. Das Problem ist, dass dies erweiterbar sein soll und somit reicht mein bisher verwendetes binäres Rechtesstem nicht mehr aus.
      MfG, Andy

      Kommentar


      • #4
        Das es gute Lösungen bereits gibt ist mir bekannt. Allerdings möchte ich selbst eine Lösung finden, da ich, um mene PHP-Kenntnisse zu erweitern, ein eigenes kleines CMS schreiben möchte.
        Was hat das eine mit dem anderen zu tun? Es sagt ja niemand, dass Du ein fertiges CMS benutzen sollst. Wenn Du ein Nested Set verwendest, benutzt Du auch einen Ansatz, den jemand anders erdacht hat. Wenn es also sinnvolle Patterns für eine Rechteverwaltung gibt, warum sie nicht nutzen?

        Das UML sieht doch ganz vernünftig aus. Ich persönlich würde allerdings auch der Gruppe ein PermissionSet zuordnen.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Zitat von Nikosch
          ...warum sie nicht nutzen?
          Richtig. Das UML ist doch keine fertige Umsetzung, sondern nur die Beschreibung, wie ich es für richtig halte. Code sehe ich da keinen...
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design before you start to write code!
          2. Discuss and review it together with experts!
          3. Choose good tools (-> Adventure PHP Framework (APF))!
          4. Write clean and reusable software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            Ok stimmt. Dachte du wolltest mir das Framework nahelegen. Entschuldige. Schau es mir noch einmal in Ruhe an.
            MfG, Andy

            Kommentar


            • #7
              Entschuldigt, dass ich hier göleich ein zweites mal hinterher schreibe, aber ich muss gestehen, dass ich durch dieses Vorhaben, dass mir diese UML vermitteln soll nicht ganz durchsteige.

              Also in der Tabelle umgtPermissions werden einfach die Rechte benannt und ihnen eine ID zugeordnet. Die umgtUser enthält einfach alle Benutzerdaten. Soweit glaube ich das verstanden zu haben. umgtRole und umgtGroup ist im Prinzip das gleiche doch ist an die "Rolle" eines Nutzers ganz bestimmte Rechte gekoppelt. An die Gruppe eines Nutzers können Rechte gekoppelt sein, zum Beispiel, dass man im Forum der Gruppe aggieren darf, dies muss aber nicht so sein. Leider verstehe ich nicht, welche Rolle nun umgtPermissionsSet bzw. umgtApplikation haben. Leider sehe ich auch keine Möglichkeit einem Nutzer direkt bestimmte Rechte zu geben, sondern man muss sehr sehr viele verschiedene Rollen zur Verfügung stellen, um alle Rechte abzudecken.

              Ich hoffe ich habe das ganze nicht vollkommen falsch verstanden bzw. dass mir hier jemand etwas mehr Licht ins Dunkel bringen kann.
              MfG, Andy

              Kommentar


              • #8
                Hallo #Avedo,

                gleich vorneweg: Rollen und Rechte sind nicht gleich, Rollen und Gruppen auch nicht! Dieser Fehler wird leider viel zu oft begangen.

                Noch mal zur Verfahrensweise: Rechte definieren die Sichtbarkeit von Objekten, Rollen definieren, welche Aktionen auf Objekte, auf die ein Benutzer Rechte hat ausgeführt werden dürfen. Das 1:1 zu koppeln raubt dir die zweite Bewertungsebene, die du gerade bei mandantenfähigen Anwendungen dringend brauchst.


                Also in der Tabelle...
                Ok, du hast mit UML noch nicht viel zu tun gehabt. Das Diagramm zeigt keine Tabellen, sondern lediglich Objekte und deren Beziehung inkl. der Qualität der Beziehung. Ich empfehle dir schnellstens ein UML-Buch zu lesen, das hilft ungemein.


                Leider verstehe ich nicht, welche Rolle nun umgtPermissionsSet bzw. umgtApplikation haben.
                Das PermissionSet ist nochmal eine Abstraktion, die du streng genommen auch weglassen könntest. Die Idee dahinter ist, dass Teile einer Rolle auch generisch für andere Rollen definiert werden können. Fakt ist jedoch, dass sich eine Rolle implizit aus einem Satz an "Aktionserlaubnissen", den Permissions, zusammensetzt. Diese definieren, dass z.B. ein Menüpunkt "Löschen" angezeigt wird. Hat ein Benutzer also eine entsprechende Rolle, kann er Objekte, auf die er auch Rechte besitzt, löschen. Falls nicht, sieht er zwar die Objekte, kann aber diese nicht löschen. Gestaltest du das generisch genug, hast du ein recht probates Mittel, eine Backend-Applikation nahezu in alle möglichen Konfigurationen zu versetzen.


                Leider sehe ich auch keine Möglichkeit einem Nutzer direkt bestimmte Rechte zu geben, sondern man muss sehr sehr viele verschiedene Rollen zur Verfügung stellen, um alle Rechte abzudecken.
                Hier vermischst du wieder Rechte und Rollen. Um einem Benutzer alle möglichen Aktionen auf alle möglichen Objekte ausführen lassen zu können, muss er lediglich Rechte auf alle Objekte und eine Rolle besitzen, die alle ausführbaren Aktionen beinhaltet. Das mag zunächst nach viel Arbeit klingen, es bietet im Nachhinein jedoch eine sehr große Flexibilität.
                Viele Grüße,
                Dr.E.

                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                1. Think about software design before you start to write code!
                2. Discuss and review it together with experts!
                3. Choose good tools (-> Adventure PHP Framework (APF))!
                4. Write clean and reusable software only!
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                Kommentar


                • #9
                  Kannst Du auch bitte noch mal die Rolle der Gruppe (umgtGroup) im Modell erklären? Trotz Kommentar verstehe ich nicht, wie sie bestimmte Rechte auf eine Usergruppe abbilden kann.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Danke dr.e. für deine Erläuterungen. Ich werde mir, wie von dir empfohlen möglichst bald ein Buch zum Thema UML anschaffen. Ich habe nun allerdings noch eine Frage. Ich habe zwar verstanden, dass diese Übersicht nur Beziehungen zwischen Objekten, keine Datenbankstrukturen darstellt, doch frage ich mich, wie eine Datenbankstruktur zu soetwas aussehen könnte.
                    MfG, Andy

                    Kommentar


                    • #11
                      Hallo Nikosch,

                      Zitat von Nikosch
                      Trotz Kommentar verstehe ich nicht, wie sie bestimmte Rechte auf eine Usergruppe abbilden kann.
                      Rollen sollten i.d.R. nicht für Gruppen vergeben werden (Erfahrung), da sonst Rollen und Rechte wieder Vermischung finden. Solltest du das jedoch abbilden wollen, muss eine Beziehung zwischen umgtRole und umgtGroup vom Typ Assoziation bestehen.

                      Zitat von Nikosch
                      Kannst Du auch bitte noch mal die Rolle der Gruppe (umgtGroup) im Modell erklären?
                      Die Gruppe ist lediglich ein Container, der dir die Vergabe von Rechte erleichtert. Im Grunde könntest du das objekt auch weglassen, wenn du Rechte auf Objekte nur auf Benutzerebene vergeben würdest. Um das auch noch weiter auf die Spitze zu treiben könnte man auch noch Organisationseinheiten einführen, die Benutzer und Gruppen strukturieren, aber das muss nicht sein.

                      Zitat von #Avedo
                      Ich habe zwar verstanden, dass diese Übersicht nur Beziehungen zwischen Objekten, keine Datenbankstrukturen darstellt, doch frage ich mich, wie eine Datenbankstruktur zu soetwas aussehen könnte.
                      Die Datenstruktur wird je nach Normalisierungsgrad anderes ausfallen. Ich finde hinsichtlich des Mappings eine Teil-Normalisierung recht angenehm. Das ER-Diagramm kann also wie folgt aussehen:

                      http://adventure-php-framework.org/f...management.png

                      Was die Abfragen angeht, so läuft die Abfrage einer Beziehung immer auf einen zweifachen JOIN hinaus. Hat man das Schema der Abfragen erst mal verstanden, so ist das Schreiben der Abfragen ein Kindespiel.
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design before you start to write code!
                      2. Discuss and review it together with experts!
                      3. Choose good tools (-> Adventure PHP Framework (APF))!
                      4. Write clean and reusable software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar

                      Lädt...
                      X