MVC - robimy system logowania
Data: 2017-08-24, autor: Michał MisztalOstatnio 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().