Frameworks.suFrameworks.su Шпаргалка вебмастера

  • Главная
  • Framework Kohana
  • PHP
  • Javascript
  • CSS
  • Сервисы
    • Генератор паролей
  • Контакты
Главная / PHP / Framework Kohana / Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

02.07.2014 12 44645

После того как вы установили и настроили Framework Kohana 3.3.x, теперь сделаем авторизацию и регистрацию на своем сайте.

Подготовка

Для начала создадим базовый контроллер Base.php в application/classes/Controller:

<?php
defined('SYSPATH') or die('No direct script access.');

abstract class Controller_Base extends Controller_Template {

    public $template = "main";
    
    public function before()
    {
        parent::before();
        $this->template->content = '';
    }
    
}

Как видно он унаследован от контроллера Controller_Template и установлен главный шаблон "main", создадим этот файл в папке application/views/main.php:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Регистрации и авторизации пользователя с использование модуля Auth в Kohana 3.3.x</title>
</head>
<body>
    <div id="wrapper">
        <div class="container">
            <div class="main">
                <?php echo $content; ?>
            </div>
        </div>
    </div>
</body>
</html>

В application/classes/Controller создадим контролер Users.php, в нем будет авторизация пользователей:

<?php
defined('SYSPATH') or die('No direct script access.');

class Controller_Users extends Controller_Base {

    public function action_login()
    {
        // Login Form View
        $this->template->content = View::factory('form_login');
    }

}

Он будет выводить форму входа на сайт, давайте как раз и создадим ее в папке application/views/form_login.php:

<form action="" method="post">
    <table>
        <tr>
            <td align="right">Логин или email:</td>
            <td>
                <input type="text" value="" name="username" />
            </td>
        </tr>
        <tr>
            <td align="right">Пароль:</td>
            <td>
                <input type="password" value="" name="password" />
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td align="center">
                <input type="submit" value="Войти" name="enter" class="btn" />
            </td>
        </tr>
    </table>
</form>

Теперь при переходе по адресу http://localhost/users/login вы можете увидеть форму входа. Не будем забывать и о странице регистрации, для этого нам так же понадобится в контроллер Users создать действие:

public function action_registration()
{
    // Registration Form
    $this->template->content = View::factory('registration_form');
}

Как видно в контент подгружается форма регистрации registration_form, давайте так же создадим ее в папке application/views/registration_form.php:

<form action="" method="post">
    <table>
        <tr>
            <td align="right">Логин: </td>
            <td>
                <input type="text" value="" name="username" />
            </td>
        </tr>
        <tr>
            <td align="right">E-mail: </td>
            <td>
                <input type="text" value="" name="email" />
                </td>
        </tr>
            <tr>
                <td align="right">Пароль: </td>
                <td>
                    <input type="password" value="" name="password" />
                </td>
            </tr>
        <tr>
            <td align="right">Повторите пароль: </td>
            <td>
                <input type="password" value="" name="password_confirm" />
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td align="center">
                <input type="submit" value="Зарегистрироваться" name="registration" class="btn" />
            </td>
        </tr>
    </table>
</form>

На этом 1-ый этап закончен, перейдя по ссылкам http://localhost/users/login и http://localhost/users/registration вы можете увидеть форму входа и регистрации пользователя.

Настройка базы данных

Для начала давайте подключим нужные нам модули для работы с БД, в файле application/bootstrap.php расскомментим auth,database и orm в массиве модулей:

Cookie::$salt = 'jh50sornxh62kx8enhg';

Kohana::modules(array(
    'auth'       => MODPATH.'auth',       // Basic authentication
    // 'cache'      => MODPATH.'cache',      // Caching with multiple backends
    // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
    'database'   => MODPATH.'database',   // Database access
    // 'image'      => MODPATH.'image',      // Image manipulation
    // 'minion'     => MODPATH.'minion',     // CLI Tasks
    'orm'        => MODPATH.'orm',        // Object Relationship Mapping
    // 'unittest'   => MODPATH.'unittest',   // Unit testing
    // 'userguide'  => MODPATH.'userguide',  // User guide and API documentation
));

Важный момент, обязательно добавляйте Cookie::$salt = 'jh50sornxh62kx8enhg'; соль перед подключением модулей.

Скопируем конфиг базы данных из modules/database/config/database.php в application/config/database.php, в нем настроим подключение:

<?php
defined('SYSPATH') OR die('No direct access allowed.');

return array
(
    // Подключение по умолчанию
    'default' => array
    (
        'type'       => 'MySQL',
        'connection' => array(
            'hostname'   => 'localhost',
            'database'   => 'database',
            'username'   => 'root',
            'password'   => FALSE,
            'persistent' => FALSE,
        ),
        'table_prefix' => '',
        'charset'      => 'utf8',
        'caching'      => FALSE,
    ),
    // Альтернативное подключение
    'alternate' => array(
        'type'       => 'PDO',
        'connection' => array(
            'dsn'        => 'mysql:host=localhost;dbname=database',
            'username'   => 'root',
            'password'   => '',
            'persistent' => FALSE,
        ),
        'table_prefix' => '',
        'charset'      => 'utf8',
        'caching'      => FALSE,
    ),
);

В этом файле установите настройки host,username,password,dbname к вашей бд. В корне модуля orm находится файл modules/orm/auth__schema__mysql.sql, запустите его например в phpmyadmin и у нас появятся 4 таблицы:

roles
roles_users
users
user_tokens

На этом все, настройка бд окончена.

Регистрация

Скопируем файл modules/auth/config/auth.php в application/config/auth.php, изменим в нем драйвер на orm, установим hash_key и session_key. Должно получится что-то на подобе этого:

<?php
defined('SYSPATH') OR die('No direct access allowed.');

return array(
    'driver'       => 'orm',
    'hash_method'  => 'sha256',
    'hash_key'     => 'msjg7394nsdhkgk58wnalpfis',
    'lifetime'     => 1209600, // запоминаем на две недели 60*60*24*14
    'session_type' => Session::$default,
    'session_key'  => 'auth_user',
);

Чтобы зарегистрировать, нужно в контролере Users.php создать пользователя методом create_user, и добавить ему роль login, если не нужно подтверждать E-маил, чтобы он смог авторизироваться:

public function action_registration()
{
    if ($post = $this->request->post())
    {
        try {
            // Сохраняем пользователя в БД
            $user = ORM::factory('user')->create_user($_POST, array('username','email','password'));

            // Выставляем ему роль, роль login означает что пользователь может авторизоваться
            $user->add('roles',ORM::factory('role',array('name'=>'login')));

            // Отправляем письмо пользователю с логином и паролем
            mail($post['email'],'Регистрация на сайте SiteName','Вы были зерегестрированы на сайте SiteName, ваш логин: '.$post['username'].' Ваш пароль: '.$post['password']);
           
            // Делаем редирект на страницу авторизации
            $this->redirect("/users/login");
        } catch (ORM_Validation_Exception $e) {
            $errors = $e->errors('models');
            // echo Debug::vars($errors);
        }
    }

    // Выводим шаблон регистрации
    $this->template->content = View::factory('registration_form');
}

В итоге на Ваш E-mail будет отправлены пароль и логин для входа, после регистрации Вас перекинет на страницу авторизации, где вы их можете ввести для того чтобы войти на сайт.

Регистрация с подтверждением E-mail:

Если Вы планируете сделать подтверждение E-mail при регистрации, то нужно сначала добавить поле token в таблицу users, в нем будем хранить хеш, для подтверждения E-mail:

ALTER TABLE `users` ADD `token` VARCHAR( 32 ) NULL ;

Далее в методе action_registration нужно при создании пользователя создавать этот хеш и сохранять в БД:

public function action_registration()
{
    if ($post = $this->request->post())
    {
        try {
            // Создаем хеш
            $token = md5(time().$_POST['username'].$_POST['email']);
            
            // Сохраняем пользователя в БД
            $data = array(
                'username' => $_POST['username'],
                'email' => $_POST['email'],
                'password' => $_POST['password'],
                'password_confirm' => $_POST['password_confirm'],
                'token' => $token,
            );
            $user = ORM::factory('user')->create_user($data, array('username','email','password','token'));
            
            // Если нужно подтверждать емаил то не нужно выставлять роль login, иначе он и без подтверждения E-mail сможет авторизоваться на сайте
            // $user->add('roles',ORM::factory('role',array('name'=>'login')));
            
            // Создаем ссылку для подтверждения E-mail
            $url  = 'http://'.$_SERVER['HTTP_HOST'].'/users/approved?token='.$token;
            
            // Отправляем письмо пользователю с ссылкой для подтверждения E-mail
            mail($post['email'],'Регистрация на сайте SiteName','Вы были зерегестрированы на сайте SiteName, для подтверждения E-mail пройдите по ссылке '.$url);
            
            // Делаем редирект на страницу авторизации
            $this->redirect("/users/login");
        } catch (ORM_Validation_Exception $e) {
            // Если произошла ошибка
            $errors = $e->errors('models');
        }
    }

    // Выводим шаблон регистрации
    $this->template->content = View::factory('registration_form');
}

И в методе action_approved добавляем роль login пользователю и авторизовываем его:

public function action_approved()
{
    $token = $this->request->query('token');
    if($token){
        // ищем пользователя с нужным токеном
        $user = ORM::factory('User')->where('token', '=', $token)->find();
        if($user->get('id')){
        
            // добавляем пользователю роль login, чтобы он мог авторизоваться
            $user->add('roles',ORM::factory('role',array('name'=>'login')));
            
            // Чистим поле с токеном
            $user->update_user(array('token'=>null), array('token'));
            
            // Можно сразу и авторизовать и перенаправить ЛК
            Auth::instance()->force_login($user->get('username'));
            $this->redirect("/users/login");
            
            // Или переадресовать на форму входа для ввода логина и пароль
            //$this->redirect("/users/login");
        }
    }

    // Делаем редирект на страницу авторизации
    $this->redirect("/users/login");
}

Таким образом можно реализовать простую регистрацию с подтверждением E-майла в Kohana.

Авторизация

Чтобы узнать авторизировался пользователь или нет, давайте изменим наше действие action_login контроллер Users, application/classes/Controller/Users.php:

public function action_login()
{
    if ($post = $this->request->post())
    {
        // Если значения логина и пароля не пустые то авторизируемся на сайте
        if(!empty($post['username']) && !empty($post['password']))
        {
            Auth::instance()->login($post['username'],$post['password']);
        }
    }
    // Проверяем авторизировался пользователь или нет
    if (Auth::instance()->logged_in())
    {       
        // Если пользователь авторизировался - то выводим например, личный кабинет
        $this->template->content = View::factory('user_profile');
    }else
    {
        // Если пользователь не авторизировался то выводим форму входа
        $this->template->content = View::factory('form_login');
    }
}

Так же была добавлена страница личного Личного кабинета в application/views/user_profile.php:

<a href="/users/logout">Выход</a>

И добавили в контролер Users действие для разлогирование пользователя, action_logout:

public function action_logout()
{
    // Разлогиниваем пользователя
    Auth::instance()->logout();
    // Редиректим его на страницу авторизации
    $this->redirect('/users/login');
}

На этом все.

Скачать рабочий пример

Теги:
  • Framework Kohana
  • Пример
  • Регистрация и авторизация

Комментарии

  1. Никитос
    Никитос
    10.01.2019 03:27

    У вас есть опечатка:

    catch (ORM_Validtion_Exception $e)

    Должно быть "ORM_Validation_Exception"

    Ответить
  2. KupueIIIKo
    KupueIIIKo
    12.06.2015 08:43

    А как же описание моделей?

    Ответить
    • Администратор
      Администратор
      12.06.2015 09:53

      Сергей, модели я не описывал т.к. для регистрации/авторизации я использовал стандартный модуль Auth с его же моделями, они находятся здесь /modules/orm/classes/Model/Auth/

      Ответить
      • KupueIIIKo
        KupueIIIKo
        12.06.2015 09:57

        Модели то надо скопировать все таки же?) Или я не прав?)

        Ответить
        • Администратор
          Администратор
          12.06.2015 10:11

          Нет, модели не нужно копировать, они и так подтянутся, главное подключить в bootstrap.php эти модули: auth, database и orm. Если же вы хотите дополнить модели своим функционалом то нужно скопировать модель modules/orm/classes/Model/User.php в папку application/classes/Model/ и там уже дописывать свой функционал или расширять уже имеющие методы.

          Ответить
          • KupueIIIKo
            KupueIIIKo
            12.06.2015 10:21

            Подозрительно я пока модель Model_User extends ORM не работал мой код который я писал)

            Ответить
            • Администратор
              Администратор
              12.06.2015 10:28

              нужно модель Model_User наследовать не от ORM, а от Model_Auth_User
              class Model_User extends Model_Auth_User{

              }
              В модели Model_Auth_User которую мы наследуем уже описаны нужные методы, и мы можем их или расширить или дополнить

              Ответить
              • KupueIIIKo
                KupueIIIKo
                12.06.2015 10:35

                if (HTTP_Request::POST == $this->request->method()){
                $post = Validation::factory($_POST);
                $post -> rule(true, 'not_empty')

                -> rule('username', 'min_length', array(':value', 26))
                -> rule('username', 'max_length', array(':value', 35))
                -> rule('username', 'alpha_numeric',array(':value', true))

                -> rule('email', 'email')

                ->rule('password_confirm', 'matches', array(':validation', 'password_confirm', 'password'));

                if($post -> check()){

                $user = ORM::factory('User')->create_user($_POST, array('username','password','email'));

                Auth::instance()->force_login($_POST['email']);
                HTTP::redirect('/setting');
                }else{
                var_dump($post -> errors());
                }
                }

                Мой код без модели не работает ((( Почему?

                Ответить
                • Администратор
                  Администратор
                  12.06.2015 11:23

                  У меня Ваш код запустился без ошибок, поэтому:
                  1. Возможно у вас не подключены модули auth, orm.
                  2. Также может быть что у вас не проходит валидацию в ORM, по умолчанию выставлено ограничение в Model_Auth_User на минимальную длину пароля 8 символов.

                  Ответить
    • Napalm Death
      Napalm Death
      06.05.2015 22:58

      А как же подтверждение емайла??

      Ответить
      • Администратор
        Администратор
        13.05.2015 02:03

        Napalm Death, для подтверждения E-майла нужно при создании пользователя не добавлять пользователю роль login, а отправить на почту ссылку с хешом и уже при переходе по этой ссылке, если такой пользователь существует, добавить ему роль login.
        Пример с подтверждения я добавил в статью, можете ознакомится.

        Ответить
        • Napalm Death
          Napalm Death
          07.06.2015 19:26

          Спасибо добрый человек, вижу раздел "Регистрация с подтверждением E-mail" (кстати здесь опечатка д<>т). Добавил твой сайт во в закладке.

          Ответить

      Оставить комментарий Отмена

      *

      *

      *

      *

      Категории

      • PHP
        • Framework Kohana
      • Javascript
      • CSS
      • Администрирование

      Теги

      Framework Kohana Пример jQuery Уроки CRON Установка и настройка Backup CSS3 Валидация API Bash Cache Captcha i18n Linux

      Авторизация

      • Забыли пароль?
      • Регистрация

      Популярные статьи

      • Находим расстояние до ближайших станций метро

        Находим расстояние до ближайших станций метро

        17.02.2017 102981
      • Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

        Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

        02.07.2014 44646
      • Собственная система лайков на PHP и JQuery

        Собственная система лайков на PHP и JQuery

        06.04.2015 33241
      • Javascript — сумма прописью

        Javascript — сумма прописью

        07.07.2014 23090
      • Cross-domain ajax с помощью jQuery

        Cross-domain ajax с помощью jQuery

        24.04.2015 19964
      Copyright © 2014-2025 Frameworks.su. Все права защищены.