+ Antworten
Ergebnis 1 bis 13 von 13

Thema: [Idee] Simples Rechtesystem

  1. #1
    Jay
    Gast

    Standard [Idee] Simples Rechtesystem

    Ich möchte mit einfachsten Mitteln ein Rechtesystem erstellen. Jetzt habe ich mir sowas überlegt. Es folgt einem einfachen Prinzip. Alle Methoden die Daten ändern bekommen zB das Prefix Write.

    Hier ein Beispiel:

    PHP-Code:
    <?php
    class PermissionProtector {
        
        public function 
    __call ($function,$parameters) {
            
            list (
    $permissionType,$function) = explode ('__',$function);
            
            switch (
    $permissionType) {
                
                case 
    'Write':
                    
    // TODO check the users permission
                
    break;

            }
            
            
    // Now call the function
            
    call_user_method_array($function,$this,$parameters);
        }
    }

    class 
    TesterClass extends PermissionProtector {
        function 
    schreibFunktion() {
            echo 
    'hey';
        }
    }

    $obj = new TesterClass();
    $obj->Write__schreibFunktion();
    ?>
    Was haltet ihr von der Idee?

    MfG Fat Tony
    Geändert von Jay (24.01.2006 um 17:23 Uhr)

  2. #2
    Ben
    Ben ist offline
    Erfahrener Benutzer Avatar von Ben
    Registriert seit
    02.12.2004
    Ort
    Koblenz
    Beiträge
    4.815

    Standard

    Nette Idee, irgendwie .. .. also .. irgendwie .. nett .. ^^
    Muss ich, wenn ich etwas mehr Konzetrationsfähigkeit aufbringe, mal drüber grübeln ..

  3. #3
    Benutzer Avatar von niklasboelter
    Registriert seit
    22.01.2006
    Beiträge
    31

    Standard

    ist handlich und doch extrem erweiterbar.
    gefaellt mir die idee :)
    PHP-Code:
    $x[] =& $x;
    $x == $x

  4. #4
    Ben
    Ben ist offline
    Erfahrener Benutzer Avatar von Ben
    Registriert seit
    02.12.2004
    Ort
    Koblenz
    Beiträge
    4.815

    Standard

    Ich frage mal weiter .. wie genau überprüfst Du denn die Rechte des Users?
    Jou, Du rufst Daten aus der Datenbank ab .. klasse *gg* .. aber wie genau speicherst Du die Rechte?

    Danke für die Antwort.
    Grüße Ben.

  5. #5
    axo
    Gast

    Standard

    uh, ganz schlecht, sorry :)
    1. mit einem einfachen verschreiber hat man die komplette protection rausgenommen.
    2. __call() halte ich für das größte übel der menschheit ... eine methode sollte zur interpretier/kompilierzeit zur verfügung stehen, und der interpreter soll sich darum kümmern, ob die methode existiert oder nicht, sonst verdirbt man die schnittstelle.
    ich erschlage jeden, der mich dazu zwingt, erst seine __call() - methode zu verstehen, bevor ich weiß, wie ich ein objekt verwenden kann bzw. welche methoden mir (wann!?! ) zur verfügung stehen.
    2. gibt es ein schönes design pattern für sowas, das heißt access proxy.

    PHP-Code:
    <?php

    interface {
        function 
    foo();
        function 
    bar();
    }

    class 
    someObj implements {
        function 
    foo() {
            
    // do something
        
    }
        function 
    bar() {
            
    // do something else
        
    }
    }

    class 
    Proxy implements {
        protected 
    $a;
        function 
    __construct (A $a) {
            
    $this -> $a;
        }
        function 
    foo() {
            
    $this -> -> foo();
        }
        function 
    bar() {
            
    $this -> -> bar();
        }

    }

    class 
    AccessProxy extends Proxy {
        private 
    $_b
        
        function 
    __construct(A $aUser $b) {
            
    parent::__construct($a);
            
    $this -> _b $b;
        }
        
        function 
    foo() {
             if(
    $this -> _b -> hasAccess()) {
                 
    $this -> _a -> foo();
             }
             throw new 
    InvalidAccessException();
        }
        
    }


    // usage:

    $user = new User();

    $ap = new AccessProxy(new someObj(),$user);
    try {
      
    $ap -> foo();
    } catch (
    Exception $e) {
        echo 
    "sorry, no access!";
    }


    ?>
    verstehen, anwenden.
    im beispiel kann man auch schön sehen, wie der accessProxy nur den zugriff auf eine methode verhindert, und die
    methode bar() gar nicht anfasst :)


    grüße
    axo

  6. #6
    Ben
    Ben ist offline
    Erfahrener Benutzer Avatar von Ben
    Registriert seit
    02.12.2004
    Ort
    Koblenz
    Beiträge
    4.815

    Standard

    Yeah. Fein. An das Proxy hatte ich auch mal (etwas länger her) gedacht, aber ich muss zugeben, dass ich es bis heute nicht so gaaaaaaaaaanz verstanden habe. Hehe ...
    Mit Deinem Quellcode werd ich mal rumspielen ..

    Grüße Ben.

  7. #7
    Erfahrener Benutzer
    Registriert seit
    28.08.2004
    Ort
    konstanz am bodensee
    Beiträge
    190

    Standard

    kann mich nur der meinung von axo anschließen...
    für das rechte system ist das proxy pattern erste sahne...

    jetzt fragt man sich natürlich warum wurden diese methoden (auch __get und __set) überhaupt eingeführt?

    in manschen fällen kann man sie sehr gut einsetzten, wenn z.B. hohe flexibilität gefordert wird.

    ich könnte mir vorstellen eine OO Datenbank abstraktion mit __call __get und __set zu bauen.
    das dann etwa so aussieht

    Code:
     $db = new DBObject('localhost','root','geheim','db1');
     $usertable = $db->tables->users();
     $usertable->row(1)->name='beny';
    
    aber wo ist hier der clou?
    die methode users im unterobjekt tables des DBObjects existiert garnicht,
    vielmehr wird hier mit der __call methode gearbeitet, die prüft ob die tabelle users in der db vorhanden ist, wenn ja wird ein Table objekt erzeugt.
    die funktion row gibt den datensatz anhand der als parameter übergebenen id zurück, das datensatz objekt hat natürlich auch keine variable, die name heißt, sondern arbeitet hier mit den __get __set methoden und prüft ob das feld vorhanden ist...

    das passt jetzt zwar nich unbedingt zu der überschrift des threads aber trotzdem, es musste halt raus

  8. #8
    axo
    Gast

    Standard

    naja, es ist halt eine andere art der programmierung... im prinzip unterstützt das ganze die 'weiche typisierung', die programme stark vereinfachen kann, aber programme auch schwieriger machen kann.
    nimm als beispiel nur mal die proxyklasse ... die könnte man natürlich auch einfach als

    PHP-Code:
    class Proxy extends someOtherObject {
       
    proteced $a;
       public function 
    __construct(someOtherObject $a) {
           
    $this -> $a;
      }

      public function 
    __call($method$args) {
             return 
    $this -> -> {$method}($args);
      }

    implementieren, und sich auf php verlassen ... man müsste bei neuen methoden in someOtherObject nichts mehr am Proxy ändern und der würde nach wie vor alle methodenaufrufe delegieren.
    das ganze geht aber nur zum preis der lesbarkeit ... kürzerer code, ab und zu unerwartetes verhalten. kommt darauf an, was einem lieber ist.
    genauso die __set und __get - methoden - wenn man keine setXXX() und getYYY() - methoden schreiben will, kann man __set verwenden, darf aber dann im objekt gar keine variablen deklarieren, und hat implizites verhalten.

    man _kann_ damit auf die schnauze fallen, _muss_ aber nicht.
    ich für meinen teil bin lieber explizit im code, dann weiß ich in einem jahr immer noch, was ich wollte... da schreib ich lieber ein paar zeilen mehr, weiß aber, dass ich der maschine ganz genau gesagt hab, was ich will.

    bei der datenbank-abstraktion das selbe - man könnte theoretisch eine wunderbare abstraktion machen, die eine komplette vererbungshierarchie durch __call(), __get() und __set() ersetzt. damit spart man sich jeweils eine klasse pro tabelle, eine klasse pro zeilentyp etc ... eine menge an code. aber man verzichtet komplett auf typisierung ... und riskiert damit fehlerhaftes default-verhalten.
    Geändert von axo (25.01.2006 um 13:48 Uhr)

  9. #9
    Erfahrener Benutzer
    Registriert seit
    28.08.2004
    Ort
    konstanz am bodensee
    Beiträge
    190

    Standard

    das stimmt, man sollte einfach sehr vorsichtig damit umgehen und nicht versuchen an so vielen stellen wie möglich diese methoden einzusetzen...

    wobei ich es bei der datenbank echt sinnvoll finde,
    da man sonst ja wie du schon sagtest immer für jede neue tabelle neuen code schreiben. oder man wendet hier codegenerierung an, so müsste es ja möglich sein mit den daten die "DESCRIPT TABLE xyz" liefert den completten code zu generieren, ich glaube im PEAR projekt gibts es solch einen ansatz schon...

    schaden das folgender code nicht funktioniert so funktioniert wie ich mir überlegt habe.

    PHP-Code:
     class {
      private 
    $val1;
      private 
    $val2;
      
      function 
    __construct(){}
      function 
    __set($key,$value){
       echo 
    "setze $key auf $value<br>";
      }
      function 
    __get($key){
       echo 
    "hohle $key<br>";
      }    
          
     }
     
     
    $a = new A();
     
    $a->val1='wee'
    hier kommt dann "Cannot access private property A::$val1",
    schön währe es wenn dieser aufruf da die variable $val1 private und somit von aussen nicht sichtbar ist auf die __get __set methode weitergeleitet würde, so hätte man innerhalb der klasse freien zugriff auf alle variablen und könnte bei externen zugriffen rechte checken und wenn es nötig ist, eingreifen.


    - edit: ich sollte mir mal angewöhnen die php und nich die code tags zu verwenden um bundischen code zu kriegen...
    Geändert von beny_mcde (25.01.2006 um 14:19 Uhr)

  10. #10
    Jay
    Gast

    Standard

    @axo
    Nach genau dem selben Prinzip hatte ich das vorher gelöst. Aber dann muss ich eben immer diese Abfrage machen und das war mir zu blöd.

    jetzt habe ich mir diese methode überlegt.

    @Ben
    Die Rechte sind im Objekt User verfügbar.
    PHP-Code:
    $user = new User();
    //Boolsche Variable
    //Sagt nur ob der User eingeloggt ist oder nicht.
    $user->permissions['moduleId']; // dieses feld enthält dann die Rechte für das jeweilige Modul. 
    Geändert von Jay (25.01.2006 um 17:39 Uhr)

  11. #11
    Ben
    Ben ist offline
    Erfahrener Benutzer Avatar von Ben
    Registriert seit
    02.12.2004
    Ort
    Koblenz
    Beiträge
    4.815

    Standard

    Äh, jo .. ich meinte jetzt eher wie Du das in der Datenbank speicherst ..

  12. #12
    Jay
    Gast

    Standard

    PHP-Code:
    #
    # The structure for table `groupPermissions`
    #
    DROP TABLE IF EXISTS `groupPermissions`;
    CREATE TABLE `groupPermissions`
    (
      `
    groupIdTINYINT UNSIGNED NOT NULL,
      `
    moduleIdSMALLINT UNSIGNED NOT NULL,
      `
    rightsCHAR (3NOT NULL,
      
    FOREIGN KEY (`groupId`) REFERENCES userGroups(`groupId`)
    TYPE=MyISAM;

    #
    # The structure for table `userGroups`
    #

    DROP TABLE IF EXISTS `userGroups`;
    CREATE TABLE `userGroups`
    (
      `
    groupIdTINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      `
    nameVARCHAR(100NOT NULL DEFAULT ''
    TYPE=MyISAM;

    #
    # The structure for table `users`
    #

    DROP TABLE IF EXISTS `users`;
    CREATE TABLE `users`
    (
      `
    userIdSMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
      `
    usernameCHAR(30NOT NULL DEFAULT '',
      `
    passwordCHAR(32NOT NULL DEFAULT '',
      `
    nameCHAR(30NOT NULL DEFAULT '',
      `
    surnameCHAR(40NOT NULL DEFAULT '',
      `
    emailVARCHAR(100NOT NULL DEFAULT '',
      `
    registerDateDATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
      `
    lastVisitDATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
      `
    blockBOOLEAN DEFAULT '0',
      `
    userGroupTINYINT(4NOT NULL  DEFAULT '1',
       
    FOREIGN KEY (`userGroup`) REFERENCES userGroups(`groupId`)
    )
    TYPE=MyISAM
    groupPermissions.rights kann folgende Werte haben.
    ned // new edit delete
    ed // edit delete
    ...
    Geändert von Jay (25.01.2006 um 18:28 Uhr)

  13. #13
    Ben
    Ben ist offline
    Erfahrener Benutzer Avatar von Ben
    Registriert seit
    02.12.2004
    Ort
    Koblenz
    Beiträge
    4.815

    Standard

    Danke

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. [PHP] Simples Caching System mittels Dateien
    Von Chr!s im Forum Tutorials
    Antworten: 5
    Letzter Beitrag: 04.11.2006, 23:55
  2. [PHP] Ein simples Bannerrotations"system"
    Von Ben im Forum Tutorials
    Antworten: 2
    Letzter Beitrag: 23.07.2006, 00:27

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34