5 Апрель 2011

Видеоурок по PHP. Часть 13

Видеоурок PHP

Приветствую вас, уважаемый читатель, в свежайшем видеоуроке по PHP. Сегодня я предлагаю изучить тему проверки роли авторизованного пользователя.

Это означает следующее:

  • Если пользователь обладает правами администратора, то дать ему возможность работать с контроллерами, относящимися к админке.
  • Если пользователь обладает лишь правами “login”, то админка для него будет закрыта.

Приступим к исполнению задуманного.

В начале я предлагаю отделить мух от котлет :)

Все контроллеры, относящиеся к админке, я засунем в поддиректорию admin в папке kohana\www\application\classes\controller.

Кроме того, необходимо задать дополнительное правило маршрутизации в файле kohana\www\application\bootstrap.php

Выглядит оно следующим образом:

Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')	
	->defaults(array(
		'directory'  => 'admin',
		'controller' => 'main',
		'action'     => 'index',
	));

Данное правило будет работать для всех URL, в которых, после доменного имени сайта, написано admin/. В нашем случае это URL вида http://kohana/admin/…

Для вышеобозначенных URL определяется директория по умолчанию (admin), а также дефоултный контроллер (main) и action (index).

Важное дополнение – bootstrap.php выполняется последовательно, поэтому общее правило дефоултной маршрутизации необходимо указывать после частного правила маршрутизации admin.

Теперь в поддиректории admin остается создать контроллер main и организовать доступ к данному контроллеру только авторизованным пользователям с правами администратора.

Сделать это можно по аналогии с контроллерами для внутренней части сайта, доступной только после авторизации.

Как вы помните, уважаемый читатель, данная задача решалась наследованием от kohana\www\application\classes\mycontroller.php, где описывался метод before:

public function before()	
{
$session = Session::instance();
$session->set('auth_redirect', $_SERVER['REQUEST_URI']);
$auth = Auth::instance();
if($auth->logged_in() == 0)  Request::initial()->redirect('auth');
return parent::before();
}

На основе mycontroller.php я предлагаю создать mycontrolleradmin.php и уже в нем подредактировать метод before:

public function before()	
{
$session = Session::instance();
$session->set('auth_redirect', $_SERVER['REQUEST_URI']);
$auth = Auth::instance();
if($auth->logged_in() == 0)  Request::initial()->redirect('auth');
if($auth->logged_in('admin') == 0)  Request::initial()->redirect('netprav');
return parent::before();
}

Мы добавили всего одно правило редиректа (7-я строка). В данной строке методом $auth->logged_in('admin') осуществляется проверка на присутствие у залогиненного пользователя роли admin.

Название роли указано в таблице roles нашей базы данных.

В видеоуроке, для работы с базой данных, я использую замечательную бесплатную программу HeidiSQL.

Теперь остается унаследовать контроллеры админки от mycontrolleradmin.php и все, задача решена:

  • При попытке входа в админку неавторизованный пользователь будет перекинут редиректом (6-я строка) на страницу авторизации.
  • Если пользователь авторизован, но у него отсутствуют права администратора, то, благодаря 7-й строке, пользователя кинет редиректом на контроллер netprav, который отобразит сообщение о нехватке прав доступа у данного пользователя.

Авторизация и обычный пользователей и администратора происходит одним и тем же контроллером auth.

Не забудьте дать администратору право login, иначе он не сможет авторизоваться.

Видеоурок:

Скачать видеоурок (*wmv, 23.9 МБ).

С уважением, Андрей Морковин.