Ankündigung

Einklappen
Keine Ankündigung bisher.

Zugriffsrechte fuer externe Module

Einklappen

Neue Werbung 2019

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

  • Zugriffsrechte fuer externe Module

    Hi!
    Ich programmiere grad ein hauseigenes CMS und benoetige gerade Hilfe.
    Vorweg: Ich programmiere dieses CMS in erster Linie nicht fuer andere sondern fuer mich, es sollte jedoch trotzdem jeder verwenden koennen.

    Also zu meiner Frage:
    Ich habe eine kleine Klasse, die mir verschiedene Module bzw Plugins ausfuehrt. Nun gibt es da ein Problem: Wie kann ich verhindern, dass diese Module auf einige Funktionen, die ich in meinem Projekt irgendwo anders definiert habe, nicht zugreifen koennen.

    Ich programmiere das ganze in PHP 4 und es sollte auch fuer diese Version kompatibel sein.

    Schonmal vielen dank

  • #2
    Wie meinst du das - dass zB die News-Klasse auf nur bestimmte Funktionen der Foren-Klasse zugreifen kann? Also die Anzahl der Threads ermitteln darf, aber nichts neues Eintragen kann? Ohne PHP5 auch noch..

    Ich weiß nicht ob es dafür bereits Design-Pattern gibt (wahrscheinlich schon, möglicherweise Zustands/State-Pattern).

    Die Klasse X die auf Klasse Y zugreifen möchte identifiziert sich bei dieser. Diese ändert daraufhin ihren Zustand und gibt entweder das angeforderte Ergebnis oder einen FALSE oder NULL Wert.

    PHP-Code:
    <?php
    class X
    {
      function 
    X()
      {
        
    $y = new Y();
        
    $y->setState(__CLASS__); // __CLASS__ ab 4.3.0 verfügbar
        
    echo $y->getInfoA();
      }
    }

    class 
    Y
    {
      var 
    $state;

      function 
    Y()
      {
        
    $this->state 0;
      }

      function 
    setState($ident)
      {
        switch (
    strtoupper($ident)) {
        case 
    'KLASSE_A':
        case 
    'KLASSE_B':
          
    $this->state 0// keine Rechte
          
    break;
        case 
    'X':
        case 
    'KLASSE_Z':
          
    $this->state 1// mehr Rechte
          
    break;
        }
      }
      
      function 
    getInfo()
      {
        if (
    $this->state 0) {
          return 
    'eigentliche Funktionsantwort';
        } else {
          return 
    FALSE;
        }
      }
    }
    ?>
    Bin allerdings nicht sicher ob das Zustands-Pattern wirklich das richtige ist. Dass dadurch dein kompletter Code, jede einzelne Methode aufgebläht wird durch die Zustands-Abfrage muss dir klar sein.
    Meine Meinung: Das ist die Mühe, erst Recht mit PHP4 nicht wert. Lieber PHP5 benutzen, Ableiten und protected/private Funktionen benutzen.

    Kommentar


    • #3
      Naja, deine Methode kann man leider umgehen. Aber danke fuer deine Antwort.
      Naja, es sollte noch fuer PHP4 gehen.
      Natuerlich koennte ich das alles fuer PHP 5 machen, aber da warte ich erst, bis PHP 6 draussen ist.

      Vielen Dank

      Kommentar


      • #4
        Das war ein Beispiel. Von mir aus kannst du zum Zustand-Setzen auch noch ein Passwort übermitteln. Selbstverständlich muss deine Y-Klasse dann zur Ansicht und Bearbeitung unzugänglich sein, das muss sie aber immer, sonst kannst du sie natürlich immer umgehen.

        Kommentar


        • #5
          Hi "Butterbrei", willkommen.

          Mit debug_backtrace() kanns du die aufrufende Klasse ermitteln und mit Konstanten mehrfache Instanzierung von Klassen verhindern. Denkbar wäre auch, den Modulen verschiedene Schlüssel mitzugeben (vielleicht das, was "Zergling" mit Passwort meinte), also wiederum Objekte, die die Client-Klasse übergibt und sih damit als berechtigt ausweist.

          Letztlich ist das aber alles nur tierisch aufwändigund extrem fragwürdig. Sieht ja so aus, als wenn du anbieten möchtest, dass sich die Benutzer deines CMS Module von Drittanbietern aus dem Netz installieren können und diese eben keinen Mist machen sollen. Nur, Mist machen können sie ja eh - ob mit der Datenbankverbindung, die sie ja wohl haben, mit Mail- oder Socket-Funktionen, Dateioperationen (Session-Files manipulieren sollte ja immer drinnen sein) oder was auch immer.

          In dem Fall wirklich besser, die API gut zu dokumentieren und Module von Drittanbietern ggf. zu zertfizieren.

          PHP 5 bietet da natürlich viel mehr Komfort, aber auch da kannst du dein Modul nicht in einen Sandkasten setzen.

          Basti

          Kommentar

          Lädt...
          X