После того как вы установили и настроили 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');
}
На этом все.
Frameworks.su Шпаргалка вебмастера
У вас есть опечатка:
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" (кстати здесь опечатка д<>т). Добавил твой сайт во в закладке.