С вопросами безопасности 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».
Как видите, на сегодняшний день существуют решения практически для любых потребностей.
Удачи!