Code Igniter и простая авторизация на сессиях.

Дата: Июль 14, 2009

(2) комментариев

Когда я начал изучать 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, который автоматически адаптирует данные для запроса.

Ну вот пожалуй и всё, если возникнут вопросы с удовольствием отвечу.

a

    Автор: alien

    , , ,




    2 комментариев на "Code Igniter и простая авторизация на сессиях."

    Сергей сказал:
    12.02.2010

    Спасибо, классная статья!

    Константин сказал:
    23.03.2010

    Хорошая статья, только самое главное то забыли :)

    $this->session->set_userdata($data);

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов