PHP framework CodeIgniter. Авторизация посетителей и ограничение доступа

Владимир | | CodeIgniter, PHP.

Авторизация посетителей

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

Прежде всего, вкратце обрисую сложившуюся ситуацию.

Большинство web ресурсов используют для защиты пару «имя — пароль». Это не самый безопасный вариант, но зато удобный (простой) в использовании.

Более сложные методы защиты требуют от посетителя либо специальных знаний, либо покупки оборудования, либо того и другого. Например, служба WebMoney использует сертификаты для авторизации пользователей. Метод хороший, но инструкция по использованию и безопасной работе с этими сертификатами занимает несколько страниц. Обычный пользователь интернета не станет связываться с такой системой без достаточно веской причины (в случае WebMoney речь идет о его собственных деньгах).

Об аппаратной защите (вроде биометрических датчиков и т.п.) и говорить не приходиться. Эти устройства стоят денег и, зачастую, немаленьких.

Поэтому, метод авторизации с помощью имени и пароля, похоже, останется самым распространенным в обозримом будущем.

В «классическом» варианте этот метод работает так. Посетитель вводит имя и пароль, вы их проверяете и, если все в порядке, записываете какой-нибудь параметр в сессию (например, имя пользователя). После этого, в каждую защищенную страницу сайта нужно добавить код, который будет проверять, установлен ли нужный параметр в сессии, и если нет, предлагать посетителю ввести имя и пароль.

Естественно, этот подход далеко не самый лучший, т.к. код проверки формы будет дублироваться на каждой странице.

CodeIgniter предлагает элегантное решение этой проблемы. Идея заключается в использовании метода _remap. Если в контроллере объявлен этот метод, то обращения к любому другому методу контроллера будут переадресованы ему.

Теперь можно разместить код проверки в методе _remap и он будет выполняться для всех обращений к сайту.

function _remap($method) {
	//страницы, доступные без авторизации
	$allowedPages = array('index', 'newuser', 'about');
	$pars = $this->uri->segment_array();
	unset($pars[1]);
	unset($pars[2]);
	if (($method != null) &&
		(($this->session->userdata('username') != null) ||	in_array($method, $allowedPages))) {
		call_user_func_array(array($this, $method), $pars);
	}
	else {
		$this->index();
	}
}

Разберем подробнее код этого примера.

Прежде всего, я объявил массив ($allowedPages) с перечнем страниц (методов контроллера) доступных без авторизации. Перечень составлен произвольно и предполагается, что страница 'index' содержит форму для ввода имени и пароля.

После этого, сохранил все сегменты адреса и удалил первые два (строки 4-6). Как вы помните, в CodeIgniter первый сегмент адреса содержит имя контроллера (оно нам не нужно), второй – имя метода (передается методу _remap в параметре $method), в остальных могут передаваться параметры (вот их нужно сохранить и передать вызываемому методу).

В строках 7, 8 проверяется можно ли вызвать указанный метод. Приведенный код вызовет метод в двух случаях:
1) если в сессии был установлен параметр 'username';
2) название метода содержится в массиве $allowedPages, т.е. доступ к нему разрешен без авторизации.

Вызов метода контроллера осуществляется с помощью функции call_user_func_array, т.к. параметры метода находятся в массиве.

Если условия не выполняются, будет вызван index(). Т.е. посетитель попадет на главную страницу сайта с формой ввода имени и пароля.

Как видите, все довольно просто.

Важно. Если ваш сайт содержит несколько контроллеров, то метод _remap должен быть объявлен в каждом из них.

Ограничения

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

В случае, если вам нужно создавать группы пользователей и назначать им различные привилегии, то, стоит попробовать одну из библиотек авторизации, разработанных специально для CodeIgniter. Например, FreakAuth, EzAuth, UserAuth.

Кроме того, можно использовать и другие библиотеки. Например, mihailt опубликовал очень интересную статью «Использование Zend_Acl для контроля доступа в Codeigniter’e».

Как видите, на сегодняшний день существуют решения практически для любых потребностей.

Удачи!