MB: User Berechtigungen im Framework

Moin Community,

wie ist die Berechtigungsreglung der User im Framework?

  • mit Präfix der Methoden Router::$controller, Router::$prefix, Router::$action so das sie das der Aufruf im Runtime erzeugenlässt $controller->{$prefix}{$action}( $params )?
  • oder andere formen des Aufrufes ausgehend von der Beechtigung?

Home.controller.php

class HomeController {
  public function admin_index() {}
  public function default_index() {}
}

vlg MB

  1. Hallo MB!

    Um welches PHP-Framework geht es denn? Was genau möchtest du erreichen bzw. wie ist deine Anwendung strukturiert?

    Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen; oder die Controller-Actions haben Metadaten (wobei ich den Namen eher schlecht finde, um Rechte abzubilden); oder die Rechteprüfung wird schon beim Routing erledigt, also bevor der Request überhaupt zum Controller kommt.

    LG andaris

    1. Moin andaris,

      Um welches PHP-Framework geht es denn? Was genau möchtest du erreichen bzw. wie ist deine Anwendung strukturiert?

      Das Framework besteht erstmal nur aus Hirnneuronen in meinem Kopf. Rein Konzeptionell. Da meine entwicklungsressourcen begrenzt sind beschränke ich mich auf einen multilinguales MVC Framework mit eventuellem trivialem User Login. Worauf es mir ankommt ist die pendantische Logik eines Frameworks.

      Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen

      Wie kann ich mir das vorstellen. Einfaches anwendungsbespiel (Hardcoden) reicht mir voll und ganz.

      oder die Controller-Actions haben Metadaten (wobei ich den Namen eher schlecht finde, um Rechte abzubilden);

      Das gleiche gilt auch hier. Einfaches Hardcoden bitte.

      oder die Rechteprüfung wird schon beim Routing erledigt, also bevor der Request überhaupt zum Controller kommt.

      Ja das hat dedlfix gesagt weil es unnötig ist.Es ist sehr sinnig.

      vlg MB

      1. Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen

        Wie kann ich mir das vorstellen. Einfaches anwendungsbespiel (Hardcoden) reicht mir voll und ganz.

        Wenn im Controller Zugriff auf das Benutzerobjekt besteht, könnte zB ein AuthorizationChecker die Rechteüberprüfung basierend auf dem aktuellen Benutzer vornehmen. Im Symfony-Framework sieht das beispielsweise so aus:

        <?php
        
        class ExampleController
        {
            public function secureAction()
            {
                if (!$this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
                    throw new \Exception('Access Denied.');
                }
        
                // [...]
            }
        }
        
        

        oder die Controller-Actions haben Metadaten (wobei ich den Namen eher schlecht finde, um Rechte abzubilden);

        Das gleiche gilt auch hier. Einfaches Hardcoden bitte.

        Beispiel vom jms/security-extra-bundle:

        <?php
        
        use JMS\SecurityExtraBundle\Annotation\PreAuthorize;
        
        class ExampleController
        {
            /** @PreAuthorize("hasRole('ROLE_USER')) */
            public function secureAction()
            {
                // [...]
            }
        }
        

        LG andaris

        1. Tach!

          Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen

          Eigentlich ist das nicht deren Aufgabe. Wenn man zumindest versucht nach Single Resposibility zu programmieren, dann hat man da schon ein "und" in der Beschreibung der Funktion: "Prüfen der Berechtigung und Ausführen von Wasauchimmer".

          Wenn im Controller Zugriff auf das Benutzerobjekt besteht, könnte zB ein AuthorizationChecker die Rechteüberprüfung basierend auf dem aktuellen Benutzer vornehmen. Im Symfony-Framework sieht das beispielsweise so aus:

          <?php
          
          class ExampleController
          {
              public function secureAction()
              {
                  if (!$this->get('security.authorization_checker')->isGranted('ROLE_USER')) {
                      throw new \Exception('Access Denied.');
                  }
          
                  // [...]
              }
          }
          

          Sehr unhübsch. Man braucht einen Magic-String, um mit dem get() ein Objekt zu holen. In anderen Worten, man braucht einen Wert, um auf bestimmten Code zugreifen zu können. Damit kann man nur schwer Tools verwenden, die den Code analysieren und einem beim Entwicklen helfen können. Das ist aufgrund der Dynamic von PHP (z.B. wenn eine Funktion unterschiedliche Typen zurückgeben kann) sowieso schon eine Herausforderung, aber Magic Strings setzen dem noch die Krone auf. "Find usages" wird unbrauchbar, weil der Analyzer nicht wissen kann, dass der String sich auf Code bezieht.

          dedlfix.

          1. Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen

            Eigentlich ist das nicht deren Aufgabe. Wenn man zumindest versucht nach Single Resposibility zu programmieren, dann hat man da schon ein "und" in der Beschreibung der Funktion: "Prüfen der Berechtigung und Ausführen von Wasauchimmer".

            Hier würde ich sagen, das kommt drauf an. Generell ist es natürlich sinnvoller, generelle Zugriffsregeln soweit möglich schon vor dem Controller zu überprüfen. Aber es kann auch durchaus sein, dass anhand der Benutzerrollen unterschiedliches "Wasauchimmer" gemacht wird. Aber du hast schon recht, je besser man die beiden Zuständigkeiten aufsplittet desto besser wartbar bleibt die Applikation.

            [...] Sehr unhübsch. Man braucht einen Magic-String, um mit dem get() ein Objekt zu holen. In anderen Worten, man braucht einen Wert, um auf bestimmten Code zugreifen zu können. Damit kann man nur schwer Tools verwenden, die den Code analysieren und einem beim Entwicklen helfen können. Das ist aufgrund der Dynamic von PHP (z.B. wenn eine Funktion unterschiedliche Typen zurückgeben kann) sowieso schon eine Herausforderung, aber Magic Strings setzen dem noch die Krone auf. "Find usages" wird unbrauchbar, weil der Analyzer nicht wissen kann, dass der String sich auf Code bezieht.

            Richtig, deshalb empfiehlt sich zB bei Symfony die Verwendung von Controllers as Services. Somit sind explizite Dependency Injection und Typehinting für statische Codeanalyse möglich. Aufgrund des notwendigen Overheads und der Tatsache, dass Controller als Bindeglied möglichst schlank sein sollten, ist dieser Ansatz jedoch nicht immer notwendig bzw. sinnvoll.

            LG andaris

            1. Tach!

              Generell kann entweder die Controller-Action selber auf das Userobjekt zugreifen und so Berechtigungen übeprüfen

              Eigentlich ist das nicht deren Aufgabe. Wenn man zumindest versucht nach Single Resposibility zu programmieren, dann hat man da schon ein "und" in der Beschreibung der Funktion: "Prüfen der Berechtigung und Ausführen von Wasauchimmer".

              Hier würde ich sagen, das kommt drauf an. Generell ist es natürlich sinnvoller, generelle Zugriffsregeln soweit möglich schon vor dem Controller zu überprüfen. Aber es kann auch durchaus sein, dass anhand der Benutzerrollen unterschiedliches "Wasauchimmer" gemacht wird. Aber du hast schon recht, je besser man die beiden Zuständigkeiten aufsplittet desto besser wartbar bleibt die Applikation.

              Man kann (und muss) nicht immer zwingend Prinzipien einhalten. Getreu dem Motto: Prinzipien sind dafür da, dass man darüber nachdenkt, bevor man sie nicht befolgt.

              Zum Beispiel kann man ja auch eine row based security benötigen, also dass die Berechtigung nicht anhand der Datenbank oder der Tabelle oder der Controller-Action festgemacht werden kann, sondern nur anhand von Kriterien im jeweils angeforderten Datensatz. Hier sehe ich auch eine Durchführung der Prüfung im Controller als sinnvoll an. Man kann ja solche Teilaufgaben in eigene Methoden oder auch Services auslagern.

              dedlfix.

  2. wie ist die Berechtigungsreglung der User im Framework?

    Es gibt eine Klasse die an die Login-Seiten URL gebunden ist. Nur im Controller dieser Klasse werden bei einem Login-Request die Credentials geprüft. Anhand einer Policy wird geprüft, welche Berechtigungen (authorization) für den Benutzer vorliegen der sich da gerade anmeldet (authentification). Die Policy ist vom Code getrennt und zwar vollständig. Je nach Policy kriegt der angemeldete Benutzer Inhalte und Backends die seiner Autorisierung entsprechen.

    Eine weitere Klasse beschreibt ggf. das Backend für den Superuser und seine Stellvertreter, die damit die Policy bearbeiten.

    MfG

    1. Hi pl,

      gilt das generell oder Programmiersprachen spezifisch speziell PHP?

      vlg MB

      1. gilt das generell oder Programmiersprachen spezifisch speziell PHP?

        Ich habe ein Framework entwickelt nach diesem Muster. Es funktioniert spwohl mit PHP als auich mit Perl und mit Sicherheit auch mit anderen Programmiersprchen 😉

        Mit PHP hb ichs allerdings nicht weiter entwickelt, bei diesem Krickelkrackel regnets bei mir rein. Mit Perl macht sich mein Dachschaden nicht so bemerkbar, da durchströmt mich sonnig wohlige Wärme.

        Schöne Grüße.

        1. Hi pl,

          Mit PHP hb ichs allerdings nicht weiter entwickelt, bei diesem Krickelkrackel regnets bei mir rein. Mit Perl macht sich mein Dachschaden nicht so bemerkbar, da durchströmt mich sonnig wohlige Wärme.

          😂 is ok. Mein Dachschaden eher weniger. Ich möchte mich nicht festlegen. Ich habs aber als eine der vielen Lösungen aufgenommen und werde gegebenenfals drauf zurüch kommen. Danke dafür.

          vlg MB