Ankündigung

Einklappen
Keine Ankündigung bisher.

Kann ich meine Loginklasse noch kompakter machen?

Einklappen

Neue Werbung 2019

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

  • Kann ich meine Loginklasse noch kompakter machen?

    Schlicht und sicher? Dass ist hier die Frage.

    Hier mal die Seite, nur provisorisch:

    PHP-Code:
    if(isset($_POST['submit']) && $_POST['submit'] == "Anmelden"){
        
    $access = new login();
        
    $access->setUser($_POST["username"]);
        
    $access->setPass($_POST["password"]);
        
    $grant $access->checkLogin();
        if(
    $grant == true){
            echo 
    "OK";
        }else{
            echo 
    "FAIL";
        }
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>netwerk - simplify your day!</title>
        </head>
        <body>
            <form id="form1" method="post" action="">
                <p>
                  <label for="username">Benutzer: </label>
                  <input type="text" name="username" id="username" />
                  <label for="username"><br />
                    <br />
                    Kennwort: </label>
                  <input type="password" name="password" id="password" />
                </p>
                <p>Anmelden
                  <input type="submit" name="submit" id="submit" value="Anmelden" />
                </p>
            </form>
        </body>
    </html> 
    Die Datenbankverbindungsklasse:

    PHP-Code:
    class clientDB {
        
        function  
    __construct() {
            
    $DSN "mysql:host=localhost;dbname=".$_SESSION["CLIENT_DATABASE_NAME"];
            
    $NW_USER "admin";
            
    $NW_PASSWD "******";
            try {
                
    $this->db = new PDO($DSN,$NW_USER,$NW_PASSWD);
            }
            catch (
    PDOException $p)
            {
                echo 
    "Connection to the client database failed.";
                echo 
    $p->getMessage();
            }
        }

    Der Anfang der Login Klasse:

    PHP-Code:
    class login {

        private 
    $db;

        public function 
    setUser($user){
            
    $this->userName $user;
        }

        public function 
    setPass($pass){
            
    $this->userPass $pass;
        }
        public function 
    checkLogin(){
            
    $this->db = new clientDB();
            
    $sql $this->db->db->prepare("Select ID from nw_users WHERE userName = ? and userPass = ?");
            
    $sql->bindValue(1,$this->userName,PDO::PARAM_STR);
            
    $sql->bindValue(2,sha1($this->userPass),PDO::PARAM_STR);
            
    $sql->execute();
            
    $result $sql->rowCount();
            if(
    $result 0){
                return 
    true;
            }else{
                return 
    false;
            }
        }

    Funktioniert ohne Probleme, meine Frage ist hald ob man das ganze noch schöner gestalten könnte oder ob Ihr sonst noch nen Tipp habt. Die Sessionverwaltung werde ich dann in einer seperaten Klasse abhandeln.

    Grüsse & gute Woche!

    eXe
    It's not a bug. It's a feature!


  • #2
    ich hätte folgendes" schöner" gemacht

    PHP-Code:
    if(isset($_POST['submit']) && $_POST['submit'] == "Anmelden"){
        
    $access = new login();
        
    $access->setUser($_POST["username"]);
        
    $access->setPass($_POST["password"]);
        
    $grant $access->checkLogin();
        if(
    $grant == true){
            echo 
    "OK";
        }else{
            echo 
    "FAIL";
        }

    in

    PHP-Code:
    if(isset($_POST['submit']) && $_POST['submit'] == "Anmelden"){
        
    $access = new login($_POST["username"],$_POST["password"]);
        if(
    $access->checkLogin()){
            echo 
    "OK";
        }else{
            echo 
    "FAIL weil...".Message::DisplayError($access->getErrorNumbers());
        }

    und dann noch eventuell:
    PHP-Code:
      public function checkLogin(){
            
    $this->db = new clientDB();
            
    $sql $this->db->db->prepare("Select ID from nw_users WHERE userName = ? and userPass = ?");
            
    $sql->bindValue(1,$this->userName,PDO::PARAM_STR);
            
    $sql->bindValue(2,sha1($this->userPass),PDO::PARAM_STR);
            
    $sql->execute();
            
    $result $sql->rowCount();
            if(
    $result 0){
                 
    session_regenerate_id();
                
    $sql $this->db->db->prepare("UPDATE nw_users SET session_id = ? WHERE userName = ? and userPass = ?");
                
    $sql->bindValue(1,session_id(),PDO::PARAM_STR);
                
    $sql->bindValue(2,$this->userName,PDO::PARAM_STR);
                
    $sql->bindValue(3,sha1($this->userPass),PDO::PARAM_STR);
                return 
    true;
            }else{
                return 
    false;
            }
        } 
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

    Kommentar


    • #3
      Klar zum Schutz von Session Fixation oder? Aber was willst du mit dem speichern der Session ID in der Datenbank erreichen? Zur Identifizierung mit welchem Benutzer du angemeldet bist?

      Gruss & vielen Dank für deinen Input!

      eXe
      It's not a bug. It's a feature!

      Kommentar


      • #4
        Zitat von da.eXecutoR Beitrag anzeigen
        Aber was willst du mit dem speichern der Session ID in der Datenbank erreichen? Zur Identifizierung mit welchem Benutzer du angemeldet bist?
        genau das.. und um doppeltes login zu sperren weil es wird ja immer die session_id abgegliechen wird
        und sobald sich ein user mit den selben daten von einem anderen client anmeldet, ist der ursprüngliche user nicht mehr angemeldet.. jedem das seine aber ich persönlich find es praktisch
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

        Kommentar


        • #5
          Ich habe die Klasse gleich noch erweitert und setze noch den Login Timestamp sowie prüfe ob es sich um die erst Anmeldung handelt:

          PHP-Code:
          class login {

              private 
          $db;

              public function 
          __construct($userName$userPass) {
                  
          $this->userName $userName;
                  
          $this->userPass $userPass;
              }
              public function 
          checkLogin(){
                  
          $this->db = new clientDB();
                  
          $sql $this->db->db->prepare("Select ID from nw_users WHERE userName = ? and userPass = ?");
                  
          $sql->bindValue(1,$this->userName,PDO::PARAM_STR);
                  
          $sql->bindValue(2,sha1($this->userPass),PDO::PARAM_STR);
                  
          $sql->execute();
                  
          $result $sql->rowCount();
                  if(
          $result 0){
                      
          // Protect from session fixation
                      
          session_regenerate_id();
                      
          $sql $this->db->db->prepare("Update nw_users SET sessionId = ?, lastLogin = ? WHERE userName = ? and userPass = ?");
                      
          $sql->bindValue(1,session_id(),PDO::PARAM_STR);
                      
          $sql->bindValue(2,date("Y-m-d h:i:s",time()),PDO::PARAM_STR);
                      
          $sql->bindValue(3,$this->userName,PDO::PARAM_STR);
                      
          $sql->bindValue(4,sha1($this->userPass),PDO::PARAM_STR);
                      
          $sql->execute();
                      
          // Check first Login
                      
          $sql $this->db->db->prepare("Select firstLogin from nw_users WHERE userName = ? and userPass = ?");
                      
          $sql->bindValue(1,$this->userName,PDO::PARAM_STR);
                      
          $sql->bindValue(2,sha1($this->userPass),PDO::PARAM_STR);
                      
          $sql->execute();
                      
          // If first Login, update it!
                      
          if($sql->fetchColumn() == "0000-00-00 00:00:00"){
                          
          $sql $this->db->db->prepare("Update nw_users SET firstLogin = ? WHERE userName = ? and userPass = ?");
                          
          $sql->bindValue(1,date("Y-m-d h:i:s",time()),PDO::PARAM_STR);
                          
          $sql->bindValue(2,$this->userName,PDO::PARAM_STR);
                          
          $sql->bindValue(3,sha1($this->userPass),PDO::PARAM_STR);
                          
          $sql->execute();
                          
          $_SESSION["system"]["user"]["firstLogin"] = true;
                      }
                      return 
          true;
                  }else{
                      return 
          false;
                  }
              }

          Lässt sich im weiteren Nutzen um Beispielsweise eine Einführungsseite anzuzeigen.
          It's not a bug. It's a feature!

          Kommentar


          • #6
            fehlt da nicht?

            PHP-Code:
            private $userName;
            private 
            $userPass
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

            Kommentar


            • #7
              Es geht noch ein klein wenig kompakter:
              PHP-Code:
              else {
                 return 
              false;

              zu
              PHP-Code:
              return false

              Kommentar


              • #8
                na ob das viel kompakter ist...
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                Kommentar


                • #9
                  um es kompakter zu machen könnte man es nach dem Prinzip auch alles in eine Zeile schreiben *g*

                  Kommentar


                  • #10
                    Zitat von Papst Beitrag anzeigen
                    um es kompakter zu machen könnte man es nach dem Prinzip auch alles in eine Zeile schreiben *g*
                    tja die beste seite ist immer noch about:blank
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                    Kommentar


                    • #11
                      Ich persönlich finde die ganze checkLogin Methode viel zu überüllt an Code. Ich mache das bei mir anders, ich teile alles auf mehrere Methoden auf. Das schafft auf alle Fälle eine bessere Übersicht. Ich finde z.B. hat die Instanz der Datenbankverbindung nichts in dieser Methode zu suchen, in der Klasse würde ich so gar keine Verbindung aufbauen, sondern diese eher nach ausen auslagern und dann diese per Type Hint übergeben. So übergibst du die Objektinstanz dann nur per Parameter an die Methode von ausen.

                      Das ist sicher Geschmackssache, ich persönlich finde das aber eleganter.

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


                      • #12
                        Zitat von litterauspirna Beitrag anzeigen
                        Ich finde z.B. hat die Instanz der Datenbankverbindung nichts in dieser Methode zu suchen, in der Klasse würde ich so gar keine Verbindung aufbauen, sondern diese eher nach ausen auslagern und dann diese per Type Hint übergeben. So übergibst du die Objektinstanz dann nur per Parameter an die Methode von ausen.

                        Das ist sicher Geschmackssache, ich persönlich finde das aber eleganter.

                        Gruß litter
                        ack, dependency injection is das stichwort...

                        Allerdings macht eine Klasse für diesen Zweck sowieso eher wenig Sinn. Besonders deine Version ist einfach nur ein Container für das, wofür man im prozeduralen Stil eine Funktion "login($user, $password)" schreiben würde...
                        Objektorientiert ist das nicht wirklich

                        Kommentar


                        • #13
                          Zitat von litterauspirna Beitrag anzeigen
                          Ich persönlich finde die ganze checkLogin Methode viel zu überüllt an Code. Ich mache das bei mir anders, ich teile alles auf mehrere Methoden auf. Das schafft auf alle Fälle eine bessere Übersicht. Ich finde z.B. hat die Instanz der Datenbankverbindung nichts in dieser Methode zu suchen, in der Klasse würde ich so gar keine Verbindung aufbauen, sondern diese eher nach ausen auslagern und dann diese per Type Hint übergeben. So übergibst du die Objektinstanz dann nur per Parameter an die Methode von ausen.

                          Das ist sicher Geschmackssache, ich persönlich finde das aber eleganter.

                          Gruß litter
                          Joa man könnte z.B. noch eine Methode machen "getUser" o.Ä. wo dann die db-Abfrage reinkommt.
                          Aber naja...
                          cu
                          Grüße
                          Destruction
                          "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

                          Kommentar


                          • #14
                            Zitat von Destruction Beitrag anzeigen
                            Joa man könnte z.B. noch eine Methode machen "getUser" o.Ä. wo dann die db-Abfrage reinkommt.
                            Aber naja...
                            cu
                            Grüße
                            Destruction
                            Nee nee da hast mich denke ich falsch verstanden. Ich meinte damit das in der Methode nicht eine Instanz zur DB bildet. Wenn dann würde ich das eben per Type Hint machen oder ich bilde die Instanz wenn überhaupt im Konstruktor der Klasse, aber nicht in einer Methode wie diese da ist, im allgemeinen ist Methode nach meinem Geschmack viel zu überfüllt.
                            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


                            • #15
                              Zitat von illuminatus
                              Allerdings macht eine Klasse für diesen Zweck sowieso eher wenig Sinn.
                              Das sehe ich eigentlich genauso.
                              Denoch verwende ich eine kleine Klasse dafür, was folgende Bewandnis hat:
                              Ich verwende für Logins generell Sessions, für die ich eine Klasse habe.
                              Die Klasse Login implementiere (nicht ganz das richtige Wort) ich dann in der Session-Klasse, so daß mir die Methoden zur User-Kontrolle dort zur Verfügung stehen.

                              Mag wieder Geschmackssache sein, empfinde das aber als wartungsfreundlich und flexibel.

                              EDIT:
                              Die DB-Instanz deklariere ich als private.
                              Competence-Center -> Enjoy the Informatrix
                              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                              Kommentar

                              Lädt...
                              X