Рейтинг@Mail.ru

Журнал "Код моё имя" » Статьи блога » Статьи

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

(4 сообщения)
  1. alien
    Участник

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

    Отправлено 2 года назад #
  2. Сергей
    Неактивен

    Опубликовано незарегистрированным пользователем: Сергей (E-mail)

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

    Отправлено 2 года назад #
  3. Константин
    Неактивен

    Опубликовано незарегистрированным пользователем: Константин (E-mail)

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

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

    Отправлено 2 года назад #
  4. anonimouse
    Неактивен

    Опубликовано незарегистрированным пользователем: (E-mail)

    CadoSmema,
    http://pandadan.com/ – cipro online pharmacy
    Patients should talk to their doctor about any side effects that they experience to determine if Cipro is the right antibiotic for them.
    http://pandadan.com/ – cipro sale

    Отправлено 5 месяцев назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.