Ankündigung

Einklappen
Keine Ankündigung bisher.

Rechteverwaltung - performates Abrufen der Rechte

Einklappen

Neue Werbung 2019

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

  • Rechteverwaltung - performates Abrufen der Rechte

    Hallo,

    ich arbeite gerade an der Rechteverwaltung einer Benutzerverwaltung. Je nach bestimmten gesetzten Rechten hat der User Zugriff auf Bereiche einer Seite oder nicht. Meine Rechte sind so gespeichert: Zu einer ID des Rechts wird ein Wert (0 = nein, 1 = ja) gespeichert. In der DB gibt es dann Globale Benutzerrechte, Gruppenrechte, Rollenrechte usw.

    Per SELECT und UNION (ungefähr 4 SELECT's mit UNION verknüpft) bekomme ich für eine benötigte Rechte-ID die jeweiligen Werte. Da das UNION mehrfache Einträge eliminiert, habe ich maximal 2 Datensätze bekommen - 0 und 1 (als Rechte-Wert). Durch von mir definierte Regeln (Recht zugeteilt schlägt Verweigerung) kann ich daraus den endgültigen Wert ermitteln.

    Jetzt meine Frage, ist es performater bei jedem Seitenaufruf ein- oder mehrmals diese Query aus zusammengeführten SELECT's auszuführen oder die Rechtewerte beim Einloggen in der Session zu speichern?

    Gruß Spam


  • #2
    Ich würde ja bei vielen solchen 0/1 Rechten die zu einer Zahl zusammenfassen, das löst schon mal ein paar Problemchen.
    Also als Binärzahl zu speichern und bei Bedarf mit Modulo Rechnung die Info rausziehen.
    Fatal Error: Windows wird gestartet

    Wie administriert man ein Netzwerk: Beispiel

    Kommentar


    • #3
      Das habe ich auch schon gedacht, aber das Problem ist dann die Erweiterbarkeit. Und das soll ein System werden bei dem man leicht neue Rechte hinzufügen können soll.
      Außerdem hab ich auch über etwas nachgedacht, PHPBB nutzt das auch, noch einen Status "Nie" bei globalen Rechten. Wenn dann "Nie" gesetzt ist und bei Bereichsrechten "Ja" siegt trotzdem das "Nie". Das wär dann ein "-1/0/1"Rechtesystem

      Kommentar


      • #4
        dann nimm zahlen zur Basis 3.
        Wieso ist doch nicht schwiriegere zu verwalten, als alles in eine eigene Spalte zu machen.
        Fatal Error: Windows wird gestartet

        Wie administriert man ein Netzwerk: Beispiel

        Kommentar


        • #5
          Das mit dem Nie kann man dann bestimmt auch ganz schön arithmetisch errechnen.
          Fatal Error: Windows wird gestartet

          Wie administriert man ein Netzwerk: Beispiel

          Kommentar


          • #6
            Ich wüsste dann aber nicht wie man den &-Operator einbauen soll, weil der ja nur 0 und 1 auf UND überprüft- mit -1, 0 und 1 funzt das nicht.

            Eine Zahl sähe dann z.B. so aus: 0100101220012

            0 = Nein, 1 = Ja, 2 = Nie

            hier wird so eine Rechnung auf binärer Basis gezeigt.

            Kommentar


            • #7
              Warum regelst du das nicht auf der Basis von Rollen?
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              http://www.lit-web.de

              Kommentar


              • #8
                Mach ich ja u.a. auch, aber nebenbei gibt es auch individuelle Benutzerrechte usw...außerdem soll man die Rollen bearbeiten können bzw. eigene hinzufügen. Mit Rollen müsste ich auch nur prüfen ob mind. eine der Rollen, die dem Benutzer direkt bzw. indirekt durch die Gruppe zugeteilt sind, das Recht hat.

                Kommentar


                • #9
                  Auf Binärbasis gibt es nur 2 Zustände!

                  Links zum Verständnis von Benutzerrollen:
                  Benutzerrolle

                  Role Based Access Control
                  PHP-Klassen auf github

                  Kommentar


                  • #10
                    naja du nimmst die Rechte (Ziffern) 0,1,2 dann bauchst du eine Zahl zur Basis 3. Sagen wir mal du hast die Rechte 1 0 2 1 0. Dann ergibt dies 1*3^4+0+2*3^2+1*3^1+0=102 die Zahl speicherst du.
                    Zurück kommt du mit Abfragen wie:
                    Du willst die dritte Ziffer (von rechts)
                    abbrunden(102 % 3^3 / 3^2)

                    Und wenn du zwischen den Stellen immer einen Puffer machst, dann kannst du aus 1 und 2 wieder null machen. Indem du es einfach addierst.
                    Fatal Error: Windows wird gestartet

                    Wie administriert man ein Netzwerk: Beispiel

                    Kommentar


                    • #11
                      Danke für den Hinweis mit dem tertiären (nennt man das so?) System.

                      Und wenn durch ein Addon jetzt ein Recht dazukommt, müsste ich von jedem (können schon viele werden) User in der Datenbank die Zahl analysieren, in die tertiäre Zahl umwandeln, neu berechnen und wieder speichern.

                      Dadurch dass man die Rechte dynamisch erweitern könne soll (bspw. durch Addons) müsste in dann noch speichern welches Recht an welcher Stelle zu finden ist.

                      Kommentar


                      • #12
                        ne per default haben die User das Recht nicht. Wenn du es hinzufügst musst du du den Zahlen einfach die entsprechende 3er Potenz hinzuaddieren und fertig.
                        Ein Int geht bis 4,2 Mrd, log_3 macht 20 Rechte, ein BigInt kann noch mal das doppelte oder sogar 4fache (weiß nicht genau)
                        Fatal Error: Windows wird gestartet

                        Wie administriert man ein Netzwerk: Beispiel

                        Kommentar


                        • #13
                          Genau und da ich ja zu der Zahl "$rechtewert * 3 ^ $stelle_von_rechts" hinzuaddieren muss muss ich ja wissen an welcher Stelle das Recht steht.

                          Kommentar


                          • #14
                            ansonsten musst du wissen, wie die Spalte für das Recht heißt, ist doch das gleiche
                            Fatal Error: Windows wird gestartet

                            Wie administriert man ein Netzwerk: Beispiel

                            Kommentar


                            • #15
                              Ok, ich habe jetzt für jede Rolle, Gruppe und Benutzer eine Zahl gespeichert, die die Rechtewerte beinhaltet. Wenn ich jetzt aber wissen will, ob dem User ein Recht zugeteilt ist, ist es da performanter bei jeder Nachfrage nach einem Recht die Zahlen aus der DB auszulesen und daraus einen endgültigen Rechtewert zu basteln oder beim Login den endgültigen Rechtewert in die session zu speichern? Wenn ich dann die Rechte von einem User ändere müsste ich den natürlich iwie dessen Sessionvariable bearbeiten.

                              Kommentar

                              Lädt...
                              X