Ankündigung

Einklappen
Keine Ankündigung bisher.

Strukturverbesserung Authentifizierung, Kernelemente eines Projekts

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

  • Strukturverbesserung Authentifizierung, Kernelemente eines Projekts

    Hallo,
    ich "arbeite" mit PHP seit einigen Wochen und habe vor kurzem den Schritt in die OOP gefunden. Aufgrund von fehlender Erfahrung habe ich "enorme" Defizite im Bereich der Strukturierung von OOP Projekten. Nunja, diese Defizite gedenke ich mit üben auszugleichen.

    Als erstes wollte ich mich an einen erweiterbaren Authentifizierungsdienst arbeiten, welche später in ein MVC intergriert werden soll.

    Der bisheriger Ansatz sieht wie folgt aus:
    userRepository
    + findeOneBy($user, $hash, $state)
    + findManyByStat($stat)
    + findManyByHash($hash)
    + update($user, $hash)
    + insert($user, $hash, $state)
    + delete($user, $hash, $state)

    sessionController
    + private keygen
    + initiateSession
    + validateSession
    + endSession

    userAuthentification
    + authentUser

    In der Umsetzung sieht das wie folgt aus:
    PHP-Code:
    <?php namespace Authentification\core;

    class 
    userRepository {
        private 
    $db;
            
        public function 
    __construct($pdo) {
            
    $this->db $pdo;
        }
        
        public function 
    __destruct() {
            
    $this->db NULL;
        }
        
        public function 
    findOneBy($user$hash$stat) {
            
    $stmt $this->db->prepare('SELECT user, hash, status FROM user WHERE user = :user AND hash = :hash AND status = :stat');
            
    $stmt->bindParam(':user'$user);
            
    $stmt->bindParam(':hash'$hash);
            
    $stmt->bindParam(':stat'$stat);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }
        
        public function 
    findManyByStat($stat) {
            
    $stmt $this->db->prepare('SELECT status FROM user WHERE status = :stat');
            
    $stmt->bindParam(':stat'$stat);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }
            
        public function 
    findManyByHash($hash) {
            
    $stmt $this->db->prepare('SELECT hash FROM user WHERE hash = :hash');
            
    $stmt->bindParam(':hash'$hash);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }
        
        private function 
    update($id$user$hash$stat) {
            
    $stmt $this->db->prepare('UPDATE user SET user = :user, hash = :hash, stat = :stat WHERE id = :id');
            
    $stmt->bindParam(':id'$id);
            
    $stmt->bindParam(':user'$user);
            
    $stmt->bindParam(':hash'$hash);
            
    $stmt->bindParam(':stat'$stat);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }
        
        public function 
    insert($user$hash$state) {
            
    $stmt $this->db->prepare('INSERT INTO user (user, hash, status) VALUES (:user, :hash, :state)');
            
    $stmt->bindParam(':user'$user);
            
    $stmt->bindParam(':hash'$hash);
            
    $stmt->bindParam(':stat'$stat);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }

        public function 
    delete($id) {
            
    $stmt $this->db->prepare('UPDATE user SET status = 0 WHERE id = :id');
            
    $stmt->bindParam(':id'$id);
            
    $stmt->execute();
            return 
    $stmt->fetch();
        }

    }

    ?>
    PHP-Code:
    <?php namespace Authentification\core;


    class 
    session {
        private 
    $key;
        
        private function 
    keygen() {
            
    $extension  hash('SHA512''?PH6gzUrt#*');
            
    $keywrapper str_split($extension64);
            
    $legiblekey $keywrapper[0].$_SERVER['HTTP_USER_AGENT'].$keywrapper[1];
            
    $this->key  hash('SHA512'$legiblekey);
        }
        
        public function 
    initiateSession() {
            
    $this->keygen();
            
    $_SESSION['key']   = $this->key;
            
    $_SESSION['date']  = date('m.d.Y H:i:s');
            
    $_SESSION['ip']    = $_SERVER['REMOTE_ADDR'];
            
    $_SESSION['host']  = $_SERVER['REMOTE_HOST'];
            
    $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
        }
        
        public function 
    validateSession() {
            
    $this->keygen();
            if(
    $_SESSION['key'] === $this->key) {
                return 
    TRUE;
            } else {
                return 
    FALSE;
            }
        }
        
        public function 
    endSession() {
            
    session_unset();
            
    session_destroy();
        }

    }


    ?>
    PHP-Code:
    <?php namespace Authentification\core;

    class 
    userAuthentification {
        private 
    $userRepository;
        private 
    $sessionController;
        
        public function 
    __construct($pdo) {
            
    $this->userRepository = new Authentifikation\core\userRepository($pdo);
            
    $this->sessionController = new Authentification\core\sessionController;       
        }
        
        public function 
    authentUser($user$pass) {
            
    $hash hash('SHA512'$pass);
            if(
    $this->userRepository->findOneBy($user$hash'1')) {
                
    $this->sessionController->initiateSession();
                return 
    TRUE;
            } else {
                return 
    FALSE;
            }
        }
    }

    ?>
    Besonders unzufrieden bin ich mit der Umsetzung von userAuthentification und die Verwendung der Authentifizierung.

    Liege ich mit meinem schlechten Gefühl da richtig?


  • #2
    Was modellierst du denn hier? Wenn du von Authentifizierung und Service-Orientierung sprichst (im Sinne des Transaction-Script-Pattern) solltest du statt Methoden wie find*() eher getUserBy*() oder getUserPermissions() o.ä. modellieren. Vielleicht findest du es dann intuitiver.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design before you start to write code!
    2. Discuss and review it together with experts!
    3. Choose good tools (-> Adventure PHP Framework (APF))!
    4. Write clean and reusable software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Da ich mich mit Namespaces noch nicht befasst habe frage ich dich einfach mal warum du die Klasse session unter dem Namespace Authenficationcore ablegst?

      Eine Session Klasse sollte doch nicht nur für einen Namespace geltend sein?

      Oder habe ich da mit dem Namespace was verhauen, im Moment ist die Klasse session doch nur erreichbar wenn der Namespace Authenficationcore bekannt gemacht wurde?

      Ansonsten zu der Klasse session, die solltest du noch mal überarbeiten, die macht meiner Meinung nach so keinen Sinn.

      Die Authentifizierung würde ich anders gestalten, mich da flexibler machen mittels Adapter wo du in der Lage bist ein Auth über mehrere Speichermedien vornehmen zu können.

      Gruß der Litter
      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


      • #4
        Was modellierst du denn hier?
        Eine Authentifizierungs "Engine", welche ich, sollte ich irgendwann die MVC Umsetzung verstehen, einsetzen würde.
        War das die richtige Antwort?

        Wenn du von Authentifizierung und Service-Orientierung sprichst (im Sinne des Transaction-Script-Pattern) solltest du statt Methoden wie find*() eher getUserBy*() oder getUserPermissions() o.ä. modellieren. Vielleicht findest du es dann intuitiver.
        Ok, merke ich mir

        Da ich mich mit Namespaces noch nicht befasst habe frage ich dich einfach mal warum du die Klasse session unter dem Namespace Authenficationcore ablegst?
        Schreibfehler soll Authentification\core heißen. Der Projektname "Authentification" ist nur ein Beispiel

        Eine Session Klasse sollte doch nicht nur für einen Namespace geltend sein?
        Wie meinst du das?

        Ansonsten zu der Klasse session, die solltest du noch mal überarbeiten, die macht meiner Meinung nach so keinen Sinn
        Welche Methoden würdest du da einsetzen?

        Die Authentifizierung würde ich anders gestalten, mich da flexibler machen mittels Adapter wo du in der Lage bist ein Auth über mehrere Speichermedien vornehmen zu können.
        Das klingt gut, kannst du mir einige Stichworte zu einem Adapter Interface in PHP nennen?

        Gruß archer42

        Kommentar


        • #5
          Zitat von litterauspirna Beitrag anzeigen
          Oder habe ich da mit dem Namespace was verhauen, im Moment ist die Klasse session doch nur erreichbar wenn der Namespace Authenficationcore bekannt gemacht wurde?
          Da vertust du dich aber. Namespaces sind im groben nichts anderes als eine logische Strukturierungshilfe von Code. Dadurch lassen sich recht einfach diese ultralangen Namen wie z.B. aus PEAR oder dem ZendFramework (1.x) vermeiden ohne in Namenskonflikte zu geraten.
          Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
          Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)

          Kommentar


          • #6
            Zitat von dennis81 Beitrag anzeigen
            Da vertust du dich aber. Namespaces sind im groben nichts anderes als eine logische Strukturierungshilfe von Code. Dadurch lassen sich recht einfach diese ultralangen Namen wie z.B. aus PEAR oder dem ZendFramework (1.x) vermeiden ohne in Namenskonflikte zu geraten.
            Danke mal für die Antwort, da habe ich das wirklich falsch verstanden.
            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

            Lädt...
            X