Тема: Авторизация в CI

Доброго времени суток!!!
Недавно начал работать с CI и почти сразу же столкнулся с проблемой авторизации: стандартной реализации не нашел, решил написать для этого функцию:

    public function authorization(){
        $user = $_POST['login'];
        $pass = $_POST['password'];
             
        if (($user!=='') && ($pass!=='') && (isset($pass)) && (isset($user))){
            
            $result = $this->Login_model->authUsers($user,$pass);
            foreach($result as $rs){
                $_SESSION['user_id'] = $rs->id;
                $_SESSION['fio'] = $rs->rem;
                $_SESSION['rol'] = $rs->rol;                
                $_SESSION['user'] = $rs->user;    
            }
            if ((isset($_SESSION['user_id'])) && (isset($_SESSION['fio'])) && (isset($_SESSION['rol']))){
                $this->smarty->assign("usr", $_SESSION['user_id']);
                $this->smarty->assign("us_name", $_SESSION['fio']);
                if (($_SESSION['user']=='admin')&&($_SESSION['rol']=='5')){
                    $this->smarty->view( 'admin/main_admv.tpl');
                }else{
                $this->smarty->view( 'main_view.tpl');
                }
                                
                //echo $tab;
            }
        }
        else
        {
            echo 'Заполните поля авторизации';
        }
    }

Но после возник вопрос в том, как организовать выход и переход на главную страницу.
Следующая функция не срабатывает:

    function logOut(){
        unset($_SESSION['fio']);
        unset($_SESSION['rols']);
        unset($_SESSION['user_id']);
        redirect('/texcon/texcon/index', 'refresh');
    }

Подскажите, где прячется ошибка smile
Заранее спасибо!

Отредактировано Михаил (10.05.2011 08:33:16)

Thumbs up Thumbs down

2

Re: Авторизация в CI

Михаил, используйте класс Session от CI (http://codeigniter.com/user_guide/libra … sions.html).
Сохраняйте и очищайте данные именно там, а не в $_SESSION.

Логин:

                $this->session->set_userdata(array(
                    'user_id'    => $user->id,
                    'username'    => $user->username
                ));

Логаут:

        $this->session->set_userdata(array('user_id' => '', 'username' => ''));
        $this->session->sess_destroy();

Thumbs up Thumbs down

3

Re: Авторизация в CI

Спасибо!
Уже разобрался smile
Просто я использовал Смарти, и класс Session не корректно работал (отправлялись какие-то заголовки). Сейчас убрал смарти, пока всё работает исправно.
Но возник другой вопрос: является ли следующий код авторизации корректным в плане безовастности? если нет, то как его можно доработать?

    public function index()    {
        if ($this->session->userdata('logged_in')){
            redirect('page/index');
        }
        else{
            $this->load->view('auth_view');
        }        
    }

    public function authorization(){
        $login = ($_POST)?$_POST['login']:$this->session->userdata('login');    
        $password  = ($_POST)?$_POST['password']:$this->session->userdata('password');
        $this->session->sess_destroy();        
        $result = $this->Texcon_model->authUsers($login,$password);
        if (count($result)){
            foreach($result as $rs){
                $authdata = array(
                    'user_id'  => $rs->id,
                    'fio'     => $rs->rem,
                    'rol' => $rs->rol,
                    'user' => $rs->user,
                    'pass' => $rs->password
                );                
            }
            $this->session->set_userdata($authdata);
            $this->session->set_userdata('logged_in', TRUE);
            redirect('/');
        } 
        else 
        {
            echo iconv("cp1251", "UTF-8", "<p class='err_mes'>Неправильный логин или пароль</p>");
        }
    }

Thumbs up Thumbs down

4

Re: Авторизация в CI

В плане безопасности класс Session работает вполне исправно.

$result = $this->Texcon_model->authUsers($login,$password);
        if (count($result)){
            foreach($result as $rs){
                $authdata = array(
                    'user_id'  => $rs->id,
                    'fio'     => $rs->rem,
                    'rol' => $rs->rol,
                    'user' => $rs->user,
                    'pass' => $rs->password
                );                
            }

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

echo iconv("cp1251", "UTF-8", "<p class='err_mes'>Неправильный логин или пароль</p>");

Это тоже совершенно непонятно, просто сохраните файл с контроллером в кодировке UTF-8 без BOM и выводите просто

echo "<p class='err_mes'>Неправильный логин или пароль</p>";

Но я лично все сообщения сохраняю в языковых файлах.

Но это так, мелочи.

И да, использовать шаблонизаторы, когда сайт разрабатывается одним человеком, знакомым с PHP, считаю совершенно бессмысленным занятием.

Отредактировано DarkShadow (20.05.2011 11:49:05)

Thumbs up Thumbs down

5

Re: Авторизация в CI

echo iconv("cp1251", "UTF-8", "<p class='err_mes'>Неправильный логин или пароль</p>");

Это тоже совершенно непонятно, просто сохраните файл с контроллером в кодировке UTF-8 без BOM и выводите просто

Просто после смены кодировки, выскакивает ошибка headers already sent by, после выявления причины ошибки от функции избавлюсь.
Ну а смарти использовал исключительно в образовательных целях smile

Но я лично все сообщения сохраняю в языковых файлах.

В данном случае используется только русский язык, т. к. делаю веб-приложение для предприяития, которое работает только в ЛВС данного предприятия... smile

Отредактировано Михаил (20.05.2011 12:19:35)

Thumbs up Thumbs down

6

Re: Авторизация в CI

Просто после смены кодировки, выскакивает ошибка headers already sent by

Нужно сохранять без BOM )
Notepad++ в помощь.

Thumbs up Thumbs down