Когда я начал изучать CI, то создавал на нём лишь простые проекты, которые не требовали авторизации, в связи с чем небыло необходимости её делать. Но тут моя фирма решила сделать нечто вроде private area, которая была доступна только для сотрудников компании и поэтому вход в закрытую зону был строго по дресс-коду. Встроенных в CI модулей для создания авторизации нет, гугл мне подсказал только TankAuth (я имею ввиду из более-менее адекватных), но этот модуль очень «топорный» на мой взгляд и является, так сказать, «на вкус и цвет» фломастером. Было принято решение написать свой модуль, с удобством, простотой и быстротой, в духе моего любимого фреймворка.
Итак, что бы его сделать нам необходимо включить встроенные сессии CI (кстати напомню, что класс сессий не использует родные php-шные сессии). Для этого нам необходимо в конфигурационном файле автозагрузок
1 | system/application/config/autoload.php |
в массив
1 | $autoload['libraries'] |
добавить элемент session. Так же можно для их хранения использовать базу (по умолчанию они хранятся в кукисах, что ограничивает размер до 4кб данных) — это повысит уровень защиты. Более подробную информацию по настройке и методам класса session можно прочитать тут.
Теперь при заходе на наш проект для каждого участника будет создаваться сессия, в которую мы можем добавлять наши данные, а это уже хорошо и очень удобно. Но вернемся к нашим баранам, то есть авторизации и добавим в базу таблицу пользователей.
1 2 3 4 5 6 7 8 9 10 11 | -- -- Структура таблицы 'users' -- CREATE TABLE users ( id int(11) NOT NULL auto_increment, login tinytext NOT NULL, `password` tinytext NOT NULL, last_login int(11) NOT NULL default '0', register_date int(11) NOT NULL default '0', PRIMARY KEY (id) ) ENGINE=MyISAM DEFAU |
Теперь, создадим модель auth.php (system/application/models/auth.php):
1 2 3 4 5 | class Auth extends Model { function Authmodel(){ // Call the Model constructor parent::Model(); } |
и добавим функцию, осуществляющую непосредственно авторизацию:
1 2 3 4 5 6 7 8 9 | function doAuth($login, $password) { $query = $this->db->get_where('users', array('login' => $login, 'password' => md5($password)), 1); if ($query->num_rows()==1) //авторизация пройдена { $data = $query->row_array(); unset($data['password']); //уберем из данных пользователя пароль, он хоть и зашифрован, но там совершенно не нужен. $data['logged_in'] = TRUE //флаг того, что авторизирован для сессии $this->db->update('users', array('last_login' => time()), array('id' => $data['id'])); //устанавливаем последним входом текущую дату retur |
Теперь у нас помимо флага «авторизированности» в сессии, который будет доступен с помощью
1 | $this->session->userdata('logged_in') |
есть еще и все данные, которые могут понадобится на сайте. А чтобы придерживатся общего стиля модель-контроллер, допишем функцию проверки авторизации в модель auth.php:
1 2 3 4 5 6 | function checkAuth() { if ($this->session->userdata('logged_in')) return TRUE; else return FALSE; } |
Ну и собственно всё, теперь можно в метод создания любого контроллера прописать проверку авторизации, и в случае если она не пройдена — редиректить на форму логина:
1 2 3 4 5 6 7 8 | class Main extends Controller { function Main() { load->helper(array('url')); if (!$this->auth->checkAuth()) redirect('login','refresh'); } function index(){ //всякие дейст |
А можно и просто в нужных местах поставить проверки и в зависимости от этого работать.
Думаю написать форму авторизации проблем не составит, а проверка осуществляется таким образом в контроллере Login, или где вам удобно:
1 2 3 4 5 6 7 8 9 10 11 12 | class Login extends Controller { function Login() { load->helper(array('url')); if ($this->auth->checkAuth()) redirect('','refresh'); //если уже авторизирован, редиректим на главную } function index() { if (!empty($_POST['login']) && !empty($_POST['pass'])) if ($this->auth->doAuth($_POST['login'], $_POST['pass']) redirect('', 'refresh'); //редиректим на главную, или какие-то другие действия else $data['error'] = 'Логин ил |
Кстати, об экранировании переданных данных можно не беспокоится, в классе авторизации используется ActiveRecord, который автоматически адаптирует данные для запроса.
Ну вот пожалуй и всё, если возникнут вопросы с удовольствием отвечу.
Code Igniter и простая авторизация на сессиях.