Всем привет, и мы продолжаем создавать наш движок на MVC , и сегодня создадим авторизацию.

Создание движка на MVC. Создаем авторизацию.

Всем привет, и мы продолжаем создавать наш движок на MVC, и сегодня создадим авторизацию.

Наши единички вывелись, все хорошо.

Откроем index.php логина в папке view.

<h1>Login</h1>

<form action="login/run" method="post">
  <label>Login</label><input type="text" name="login"><br>
  <label>Password</label><input type="text" name="password"><br>
  <label></label><input type="submit">
</form>

Action задан на метод run. Перейдем в контроллер login.php и добавим его

public function run() {
  $this->model->run();
}

В модели логина уберем вывод единичек. Создадим метод run().

public function run() {
  $sth = $this->db->prepare("SELECT id FROM users WHERE login = :login AND password = MD5(:password)");
  $sth->execute(array(
   ':login' => $_POST['login'],
   ':password' => $_POST['password']
  ));

  $data = $sth->fetchAll();
  $count = $sth = rowCount();
  if($count > 0) {
   Session::init();
   Session::set('loggedIn', true);
   header('Location: ../dashboard');
  } else {
   header('Location: ../login');
  }
}

Здесь мы используем PDO, и я опять же хочу напомнить, кто его не знает, смотрите на сайте статьи по этой теме.

Теперь в нашей базе mvc нам нужно создать таблицу users с 3 полями: id, login, password.

login и password будут типом varchar, login длиной 25, password длиной 32 символа, там будет хэш.

id будет primary key и autoincrement.

Добавим тестового пользователя с логином jesse и паролем - хэшированным логином.

В конструкторе модели логина вызовем родительский конструктор.

public function __construct() {   parent::__construct(); }

Сейчас создадим новый файл dashboard.php в папке controllers, куда скопируем все из контроллера login кроме метода run.

class Dashboard extends Controller {
  // ...
  public function index() {
   $this-view->render('dashboard/index');
  }
}

В папке views создадим папку dashboard, где создадим файл index.php с таким содержанием.

Dashboard... Login in only...

В папке libs создадим файл Session.php

class Session {
  public static function init() {
   @session_start();
  }

  public static function set($key, $value) {
   $_SESSION[$key] = $value;
  }

  public static function get($key) {
   if(isset($_SESSION[$key]))
   return $_SESSION[$key];
  }

  public static function destroy() {
   // unset($_SESSION);
   session_destroy();
  }
}

Добавьте подключение этого файла в index.php после подключения базы данных.

require 'libs/Session.php';

Вызовем в конструкторе класса Dashboard метод init() класса Session.

public function __construct() {
  parent::__construct();
  Session::init();
  $logged = Session::get('loggedIn');
  if($logged == false) {
   Session::destroy();
   header('Location: ../login');
   exit();
  }
}

Также создадим метод logout() в классе dashboard.

public function logout() {
  Session::destroy();
  header('Location: ../login');
  exit();
}

Теперь перейдем в header.php и создадим там ссылку на выход в меню.

<?php if(Session::get('loggedIn') == true):?>
  <a href="<?php echo URL; ?>dashboard/logout">Logout</a>
<?php else: ?>
  <a href="<?php echo URL; ?>login">Login</a>
<?php endif; ?>

Теперь добавим вызов метода init() перед блоком с id=header

<?php Session::init(); ?>

Все что осталось, определить константы в файле database.php.

define('DB_TYPE', 'mysql');
define('DB_HOST', 'localhost');
define('DB_NAME', 'mvc');
define('DB_USER', 'root');
define('DB_PASS', '');

Теперь перейдите в файл Database.php и там измените подключение, подставив вместо значений константы, которые мы только что определили.

Итак, могу вас поздравить, мы только что сделали авторизацию. Спасибо за внимание и удачи!