Как лучше всего ограничивать определенные страницы для зарегистрированных пользователей только в Codeigniter? - PullRequest
5 голосов
/ 29 сентября 2010

Я создал регистрацию и логин для своего веб-сайта, и вся проверка корректно работает как для регистрации, так и для входа. После того, как пользователь предоставит действительные учетные данные, он / она войдет в личный кабинет с приветственным сообщением, в котором будет сказано: Hello first_name last_name .. в основном имя и фамилия извлекаются из базы данных.

Любой способ, которым я хочу это ограничить членскую зону только зарегистрированными пользователями. Любой другой будет перенаправлен на домашнюю страницу или страницу входа, или куда бы я ни решил, что он должен быть перенаправлен на.

Я использовал ci_sessions, которые хранятся в таблице "ci_sessions" в моей базе данных. Session_id, ip_address, user_agent, last_activity и user_data являются столбцами. Поэтому я предполагаю, что это какая-то форма безопасности, а не сохранение куки-файлов только в браузере пользователя.

В любом случае, прямо сейчас, чтобы остановить кого-либо, кроме зарегистрированных пользователей, доступ к моей учетной записи на сайте, например. http://example.com/member_area Я использую простое выражение if в моем контроллере для области пользователя:

if (! $this->session->userdata('first_name'))
    {
    redirect('login');
}

Это проверяет, есть ли у человека, который пытается получить доступ к странице области пользователя, какие-либо данные, хранящиеся в user_data в моей таблице ci_sessions, такие как first_name, и, если да, позволяет им получить доступ к странице, то есть они должны были войти в систему. и все еще иметь активный сеанс.

Если в базе данных ничего не найдено, они перенаправляются на страницу входа в систему. То, что я хочу знать, есть ли лучший способ сделать это? Достаточно ли безопасен способ, которым я сейчас занимаюсь?

Ниже код моей модели:

<?php
class Current_User {

    private static $user;

    private function __construct() {}

    public static function user() {

        if(!isset(self::$user)) {

            $CI =& get_instance();
            $CI->load->library('session');

            if (!$user_id = $CI->session->userdata('user_id')) {
                return FALSE;
            }

            if (!$u = Doctrine::getTable('User')->find($user_id)) {
                return FALSE;
            }

            self::$user = $u;
        }

        return self::$user;
    }


    public static function login($email, $password) {

        // get User object by email
        if ($u = Doctrine::getTable('User')->findOneByEmail($email)) {


            // to ge the mutated version of the input password
            $u_input = new User();
            $u_input->password = $password;

            // password match
            if ($u->password == $u_input->password) {


                $CI =& get_instance();
                $CI->load->library('session');
                $CI->session->set_userdata('user_id',$u->id);
                $CI->session->set_userdata('username',$u->username);
                $CI->session->set_userdata('first_name',$u->first_name);
                $CI->session->set_userdata('last_name',$u->last_name);

                self::$user = $u;

                return TRUE;
            }

            unset($u_input);
        }

        // login failed
        return FALSE;

    }


    public function __clone() {
        trigger_error('No duplicates allowed.', E_USER_ERROR);
    }

}

Все ваши советы приветствуются.

UPDATE

Как насчет добавления этого в мою модель

$CI->session->set_userdata('logged_in', 'TRUE');

Это в основном добавляет «logged_in» к моим пользовательским данным в сеансе в БД со значением «ИСТИНА». в моем контроллере для моей "области пользователя" я отредактировал оператор if, чтобы сказать это:

if (! $this->session->userdata('logged_in')==TRUE)
{
redirect('login');

}

Если элемент не существует (чего не будет, если пользователь не вошел в систему), тогда будет возвращено FALSE, и пользователь будет перенаправлен на страницу входа

Что вы думаете?

или я мог бы даже сделать TRUE чем-то секретным, например, dsb453rerfksdhbdsks322. Нечто случайное.

Ответы [ 3 ]

11 голосов
/ 29 сентября 2010

Вы ударили ноготь по голове, но есть немного более эффективный способ сделать это.

Расширьте базовые контроллеры, в одну сторону (я думаю, первоначально обрисованные в общих чертах Филом Стердженом), но я подведу итоги здесь:

См. эту статью для очень глубокой рецензии.

но по существу:

<?php
class MY_Controller extends Controller
{
    function __construct()
    {
        parent::Controller();
        if (! $this->session->userdata('first_name'))
        {
            redirect('login'); // the user is not logged in, redirect them!
        }
    }
}

так что теперь, если вы хотите ограничить доступ, просто:

class Secret_page extends MY_Controller {

 // your logged in specific controller code
}

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

Что касается того, как, я бы, вероятно, установил user_id в качестве значения, чтобы проверить, установлен ли он, или, возможно, пользовательскую "группу" - тогда вы можете получить права пользователя и различные уровни доступа в вашей системе.

надеюсь, это немного поможет.

редактировать

Добавить это в application / config.php

/*
| -------------------------------------------------------------------
|  Native Auto-load
| -------------------------------------------------------------------
| 
| Nothing to do with cnfig/autoload.php, this allows PHP autoload to work
| for base controllers and some third-party libraries.
|
*/
function __autoload($class)
{
    if(strpos($class, 'CI_') !== 0)
    {
        @include_once( APPPATH . 'core/'. $class . EXT );
    }
}

Поскольку вы используете CI 2.0, вам нужно будет поместить MY_Controllers в Application / CORE, а не в библиотеки.

Мое приложение / ядро ​​выглядит примерно так:

Admin_Controller.php
MY_Controller.php
Public_Controller.php
0 голосов
/ 02 ноября 2010

Я не думаю, что это задача контролера для реализации безопасности, она должна просто проверить это. Вы можете кодировать свою логику аутентификации в библиотеке. Далее, автозагрузка этой библиотеки. В ваших методах контроллера, которые обслуживают защищенный контент, вы можете просто сделать это:

$ this-> auth-> ограничение ();

0 голосов
/ 03 октября 2010

я использую что-то вроде:

    $user_session = $this->model_user_lite->Session_Check();
    if ( $user_session == FALSE )
    {
        redirect('main/about');
        exit();
    }
    $data['auth'] = $user_session;
    $user_id = $this->model_user_lite->Session_UserID ();

для защиты не контроллера, а функций самостоятельно, что, на мой взгляд, более эффективно. Код довольно понятен, но я также поставил проверку сеанса:

function Session_Check ( $return_link = FALSE )
{

    $auth   = $this->session->userdata('logged_in');
    if ( $auth == FALSE )
    {
        $return_value = FALSE;
    }
    else
    {
        $return_value = TRUE;
    }

    return $return_value;

}

поэтому, когда пользователь входит в систему, мы просто устанавливаем для userdata "logged_in" значение TRUE и проверяем его в любое время.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...