После того как вы установили и настроили 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> </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> </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'); }
На этом все.
У вас есть опечатка:
catch (ORM_Validtion_Exception $e)
Должно быть "ORM_Validation_Exception"
А как же описание моделей?
Сергей, модели я не описывал т.к. для регистрации/авторизации я использовал стандартный модуль Auth с его же моделями, они находятся здесь /modules/orm/classes/Model/Auth/
Модели то надо скопировать все таки же?) Или я не прав?)
Нет, модели не нужно копировать, они и так подтянутся, главное подключить в bootstrap.php эти модули: auth, database и orm. Если же вы хотите дополнить модели своим функционалом то нужно скопировать модель modules/orm/classes/Model/User.php в папку application/classes/Model/ и там уже дописывать свой функционал или расширять уже имеющие методы.
Подозрительно я пока модель Model_User extends ORM не работал мой код который я писал)
нужно модель Model_User наследовать не от ORM, а от Model_Auth_User
class Model_User extends Model_Auth_User{
}
В модели Model_Auth_User которую мы наследуем уже описаны нужные методы, и мы можем их или расширить или дополнить
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());
}
}
Мой код без модели не работает ((( Почему?
У меня Ваш код запустился без ошибок, поэтому:
1. Возможно у вас не подключены модули auth, orm.
2. Также может быть что у вас не проходит валидацию в ORM, по умолчанию выставлено ограничение в Model_Auth_User на минимальную длину пароля 8 символов.
А как же подтверждение емайла??
Napalm Death, для подтверждения E-майла нужно при создании пользователя не добавлять пользователю роль login, а отправить на почту ссылку с хешом и уже при переходе по этой ссылке, если такой пользователь существует, добавить ему роль login.
Пример с подтверждения я добавил в статью, можете ознакомится.
Спасибо добрый человек, вижу раздел "Регистрация с подтверждением E-mail" (кстати здесь опечатка д<>т). Добавил твой сайт во в закладке.