Ankündigung

Einklappen
Keine Ankündigung bisher.

Binäres Rechtesystem

Einklappen

Neue Werbung 2019

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

  • #16
    Zitat von drsoong
    Wenn es darum ging, dass nur eine Permissionszahl zugleich ausdrückt das ein User im Bereich A nur lesen, schreiben darf und in F nur erstellen, dann fände ich die Sache smart. Ansonsten, na ja...
    Und hättest du dir meine Klasse durchgelsen, dan wüsstest du, dass es genau so ist. Jeder User bekommt nur eine Permissions-Zahl zugewissen, aus der man alle IDs der Bereiche zu denen er Zutritt hat extrahieren kann.

    Beispiel: Rechte von Klaus sind 70. Lässt man das durch die Methode, die ich in meinem ersten Post separat gepostet habe, laufen, so erhält man
    Array
    (
    [0] => 6
    [1] => 4
    [2] => 3
    [3] => 1
    )
    Klaus darf also die Bereich 1, 4, 3 und 1 betreten (welche auch immer das sind).

    @David:
    Danke! Wenn du dir in der Klasse die Methode getPerms() anschaust wirst du feststellen, dass es dort auch so gemacht ist.
    MfG, Andy

    Kommentar


    • #17
      Zitat von #Avedo Beitrag anzeigen

      @David:
      Danke! Wenn du dir in der Klasse die Methode getPerms() anschaust wirst du feststellen, dass es dort auch so gemacht ist.
      MfG, Andy
      Ah stimmt. Im Forum gucke ich mir in der Regel nicht mehr als vielleicht 10 Zeilen Code an

      Kommentar


      • #18
        Ich konnte die Performance dank solcher Tipps wie deinem schon sehr optimieren.
        MfG, Andy

        Kommentar


        • #19
          Wie kann ich den, wenn ich so ein Rechtessytem verwende, möglichst effizient alle User ausrechnen die z.b. das Recht A haben? Dann müsste ich doch alle User auslesen und überprüfen ob das bestimmte Bit gesetzt ist oder nicht. Somit müsste ich wirklich alle einmal komplett durchgehen ...

          Kommentar


          • #20
            Und wann muss ich diese Liste möglichst effizient ermitteln lassen?

            Kommentar


            • #21
              Will ja nicht weiter stören, aber...

              Und hättest du dir meine Klasse durchgelsen, dan wüsstest du, dass es genau so ist. Jeder User bekommt nur eine Permissions-Zahl zugewissen, aus der man alle IDs der Bereiche zu denen er Zutritt hat extrahieren kann.
              1. Sorry, ich habe tatsächlich nicht den kompletten Code analysiert, was aus meiner Sicht auch erlaubt sein soll, wenn der über 15 Zeilen hinausgeht. Statt dessen habe ich mich auf das gestützt, was Du ansonsten so sagst.

              Du kannst mich da gerne noch mal korrigieren: Ich verstehe das ein User z. B. folgende Rechte hat.

              Bereich A => Lesen, Schreiben
              Bereich C => Erstellen
              Bereich U => Lesen
              usw.

              So und jetzt sagst Du wieder in direkter Antwort auf meine Einwände
              alle IDs der Bereiche zu denen er Zutritt hat extrahieren kann.
              was für mich orientiert am obigen Beispiel nur heißt, dass Du lediglich

              A, C, U ermittelst aber nicht die Rechte innerhalb von A,C,U.
              [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

              Kommentar


              • #22
                Ich halte es da eher mit drei Tabellen:
                Code:
                Table `user`:
                +----+------+
                | id | name |
                +----+------+
                |  1 | Mäxx |
                |  2 | Caro |
                |  3 | Udo  |
                +----+------+
                
                
                Table `right`:
                +----+-----------+
                | id | name      |
                +----+-----------+
                |  1 | lesen     |
                |  2 | schreiben |
                +----+-----------+
                
                
                Table `permission`:
                +--------+---------+
                | userid | rightid |
                +--------+---------+
                |      1 |       1 |
                |      2 |       1 |
                |      3 |       1 |
                |      3 |       2 |
                +--------+---------+
                Damit kann man alle Rechte, die man braucht festlegen und man hat auch keine Begrenzung.

                Mäxx und Caro dürfen lesen und Udo darf als einziger lesen und schreiben.
                Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                Kommentar


                • #23
                  @#Avedo:
                  Ohne mal auf das Prinzip der Bitmasken für Berechtigungen näher einzugehen, finde ich an Deinem Code eine Sache gruselig:

                  In calcPerms wird erwartet, dass $mods die Berechtigungen in Form der ID, also des Exponenten 0,1,2,3,... enthält.
                  In getPerms wird aber die jeweilige Potenz (1,2,4,8,...) in $mods zurück geliefert.

                  Etwas mehr Konsistenz wäre nicht schlecht. Da passieren Fehler doch mit Ansage.
                  **********************************
                  Nein, ich bin nicht die Signatur.
                  Ich putze hier nur.
                  **********************************

                  Kommentar


                  • #24
                    Die Lösung von Manko10

                    addressiert glaube ich nicht ganz das volle Problem, oder?

                    Gut, man weiß jetzt das Udo lesen und schreiben darf, was sicherlich
                    auch sehr schnell zu ermitteln ist. Allerdings weiß man da gar nicht wo
                    diese Rechte ausgeübt werden können. Stichwort: Bereiche.
                    [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

                    Kommentar


                    • #25
                      @Flor1an: Welchen tieferen Sinn soll es denn in einem solchen Rechtesystem erfüllen zu wissen, welche Leute alle das Recht haben in Bereich A zu kommen?Wenn du überprüfen möchtest, ob ein Nutzer einen bereich betreten darf kannst du auch einfach den Namen oder die ID des Nutzers und des Bereichs an die Methode check übermitteln. Man kann dazu natürlich eine Methode machen, aber ich muss sagen, dass mir da der tiefere Sinn fehlt.

                      @Der_Gerhard:
                      Etwas mehr Konsistenz wäre nicht schlecht. Da passieren Fehler doch mit Ansage.
                      Was willst du mir jetzt damit sagen? Die getPerms()-Methode könnte ich tatsächlich noch anpassen. Man müsste ja bloß den Logarithmus zur Basis 2 auf alle Elemente anwenden.

                      Mit der Methode calcPerms() ist es relativ einfach möglich die Zugriffsrechte eines Nutzers zu ändern. Als erstes holt man sich mit getMods() alle existierenden Bereiche und dann mit getPerms() die Ids zu den Bereichen, zu denen der bearbeitete Nutzer momentan Zugriffsrechte besitzt. Nun gibt man für alle Bereiche eine Checkbox aus, wobei man mit in_array() überprüft, ob der Benutzer zum Zeitpunkt des erstellens der Checkboxen die Zugriffsrechte zu diesem Bereich besitzt. Ist dies der Fall wird die Checkbox als checked erstellt. nach der Ausgabe sind nun also für alle geschützten Bereiche erstellt worden, wobei die zu denen der Nutzer Zugriffsrechte besitzt makiert sind. Nun kann man die Zugriffsrechte durch markieren der Checkboxen beliebig ändern. Nach dem Absenden des Formulars steht also ein Array mit den Ids der Bereiche, zu denen der Benutzer zukünftig Zugriff haben soll, zur Verfügung. Mit der Methode calcPerms() errechnet man nun den binären Wert, der in die Spalte permissions in die Benutzer-tabelle eingetragen werden soll. Dies geschieht dann über die Methode editUser(), der man einfach alle zu ändernden Felder und ihre zugehörigen Values übergibt.

                      Ich hoffe ich konnte etwas Licht ins Dunkel bringen. Werde, wenn ich morgen mal kurz Zeit habe die Methode getPerms() mal ändern.
                      MfG, Andy

                      Kommentar


                      • #26
                        @drsoong: Wenn du willst, kannst du statt 'lesen' auch 'Gästebuch lesen' oder eine Nummer vergeben. Das steht dir ja völlig frei.
                        Wenn du willst, kannst du auch einen Table für die Bereiche anlegen, die du im Table `permission` ebenfalls referenzierst. Somit kannst du für jeden Bereich abfragen, welcher User hier lesen oder schreiben oder sonst etwas darf.

                        Du hast bei der Lösung vielleicht einen Table mehr, aber ich halte sie für bei Weitem nicht so komplex wie die Lösung mit boolescher Algebra. Außerdem hat sie keine Beschränkung von 31 Rechten.
                        Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                        Kommentar


                        • #27
                          was für mich orientiert am obigen Beispiel nur heißt, dass Du lediglich
                          A, C, U ermittelst aber nicht die Rechte innerhalb von A,C,U.
                          Wieso willst du das denn trennen? Machen wir doch einfach mal ein Beispiel:
                          In der Tabelle für die Bereiche steht:

                          ID | Bereich
                          1 | Article add
                          2 | Article edit
                          3 | Article remove
                          4 | User add
                          5 | User edit
                          6 | User remove
                          7 | Guestbook edit
                          8 | Guestbook remove
                          9 | Counter reset
                          10 | Settings edit
                          11 | NewsFeed add
                          12 | NewsFeed edit
                          13 | NewsFeed remove
                          14 | Imprint edit
                          15 | Download add
                          16 | Download remove
                          17 | Statistics view
                          18 | Newsletter send

                          Zudem gibt es ja auch bereiche, in denen man auch mit den rechten NULL arbeiten kann. Zum Beispiel das eigene Profil verwalten. Zudem gibt es wie du auch siehst nicht immer die Notwendigkeit add, edit and remove zu deklarieren. Es macht bei einem Counter zum Beispiel nur eine reset-Funktion Sinn. Oftmals kann man zum Beispiel, wie beim Impressum nur das ganze editieren. Braucht man diesen Bereich nicht mehr oder man braucht ein neues kann man das jeweilige Modul installieren.

                          MfG, Andy

                          //EDIT: habe mal folgende Zeile in der Methode getPerms() geändert, sodass nun die IDs der Bereiche zurückgegeben werden.
                          PHP-Code:
                          $mods[] = log($i2); 

                          Kommentar


                          • #28
                            Zitat von #Avedo Beitrag anzeigen
                            @Der_Gerhard: Was willst du mir jetzt damit sagen? Die getPerms()-Methode könnte ich tatsächlich noch anpassen. Man müsste ja bloß den Logarithmus zur Basis 2 auf alle Elemente anwenden.
                            Damit meine ich, dass zum Setzen und Abfragen des selben Feldes auch die selben Werte verwendet werden sollten.

                            Wenn ich einen Benutzer aus einem Bereich ausschließen (oder hinzufügen) will, ohne die anderen zu verändern, muss man mit Deiner Methode getPerms aufrufen, dann alle Werte des Arrays umrechnen, das eine Feld verändern und danach das Array wieder in calcPerms reinschieben.
                            Du musst immer aufpassen, ob Du nun ein Feld mit Parameters aus getPerms hast oder eines für calsPerms.

                            Das ist ganz einfach inkonstistent.
                            [/QUOTE]
                            **********************************
                            Nein, ich bin nicht die Signatur.
                            Ich putze hier nur.
                            **********************************

                            Kommentar


                            • #29
                              Naja nun brauchst du ja nicht mehr alle Werte umrechnen. Es werden nun ja direkt die IDs der Bereiche zurückgegeben und dann kann man ja verfahren, wie ich es oben bereits erläutert habe.
                              MfG, Andy

                              Kommentar


                              • #30
                                Community, User haben verschieden Rechte z.b. Premium/Normale User, Moderatoren etc. Und jetzt möchte ich eben eine Liste aller Premium User etc.

                                Kommentar

                                Lädt...
                                X