MVC - robimy system logowania

Data: 2017-08-24, autor: Michał Misztal

Ostatnio wyrenderowaliśmy sobie to i owo na stronie. Teraz idziemy dalej. Krok ku zaludnianiu naszej bazy - system logowania. Pierwsze co to wypadałoby zrobić domyślnego użytkownika i hasło w naszej bazie. Do hashowania użyjemy funkcji password_hash z opcją BCRYPT.

Kontroler logowania wygląda tak



class Admin extends Controller {

    function __construct() {
        parent::__construct();
    }
    
    function index($url){

        if($url==="wyloguj") $this->logout ();
        
        if(isset($_SESSION["zalogowany"])){
            $this->view->render("admin/admin");
        }else{
        
            $data=$this->model->zaloguj();

            if(isset($data[0]["nazwisko"])){
                $_SESSION["id"]=$data[0]["id"];
                $_SESSION["login"]=$data[0]["login"];
                $_SESSION["nazwisko"]=$data[0]["nazwisko"];
                $_SESSION["zalogowany"]=true;
                $this->view->zaloguj($data);
                $this->view->render("admin/admin");
            }else{
                $this->view->render("admin/index");
            }
        
        }
    }

    function logout(){
        unset($_SESSION["zalogowany"]);
        session_destroy();
    }
}

No i tak, gdy w linku będzie "wyloguj" to niszczymy sesję. A jeśli nie to model wykonuje za nas czarną robotę i sprawdza dane. Jeśli jeszcze jesteśmy zalogowani to od razu zostaniemy przeniesieni do zastrzeżonej zawartości bez konieczności habrowania przy formularzu. Na razie wsio jest jasne. Żeby dane z kontrolera były widoczne dla widoku to do klasy View dodajemy metodę



 function zaloguj($data){
     $this->data=$data;
 }

Formularz kontaktowy dla widoku admin/index wygląda przykładowo tak



<h1>Zaloguj</h1>

<form method="post" action="<?php echo ROOT;?>admin">
       
    <label>
        Login: <input type="text" name="login">
    </label>
    <label>
        Hasło: <input type="password" name="pass">
    </label>
    
    <input type="submit" value="Zaloguj">
    
</form>

Widok po zalogowaniu wygląda tak



<h1>Witaj <?php echo $_SESSION["nazwisko"];?></h1>

<nav class="navAdmin">
    <a href="<?php echo ROOT;?>admin/wyloguj">Wyloguj</a>
    <a href="<?php echo ROOT;?>admin/listapromocji">Lista promocji</a>
</nav>

No i jeszcze model, tada



class Admin_Model extends Model {

    function __construct() {
        parent::__construct();
    }
    
    function zaloguj(){
        
        $login=filter_var($_POST["login"],FILTER_SANITIZE_STRING);
        $pass=filter_var($_POST["pass"],FILTER_SANITIZE_STRING);
        
        $hash= password_hash($pass,PASSWORD_BCRYPT);
        
        $stmt=$this->db->prepare("select id,login,nazwisko,ranga,password from users where login=:login;");
        $stmt->bindValue(":login",$login);
        $stmt->execute();
        
        $this->data=$stmt->fetchAll();

        if(password_verify($pass,$this->data[0]["password"])){
            return $this->data;
            
        }else{
            return false;
        }
        
    }

}

OK, otrzymane w superglobalnej POST dane najpierw filtrujemy i sprawdzamy czy w bazie jest taki login. Jeśli jest to przepuszczamy hasło przez funkcję haszującą i funkcją password_verify sprawdzamy czy występuje dopasowanie. Jeśli wszystko się zgadza do kontrolera wędrują dane z bazy danych i ładowany jest widok admin/admin. W przeciwnym wypadku zwracany jest fałsz. Kontroler przekierowuje wtedy do pliku "index.php".

No i na koniec - w głównym pliku "index.php" dodajemy session_start().

Skomentuj lub zgłoś błąd

© Michał Misztal 2023