Какова наилучшая практика для ограничения определенных страниц для входа в систему только в Codeigniter?

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

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

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

В любом случае, сейчас, чтобы остановить кого-либо другого, кроме зарегистрированных пользователей, для доступа к участку моего веб-сайта, например http://mysite.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); } } с <?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); } } 

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

ОБНОВИТЬ

Как добавить это в мою модель

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

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

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

}

Если элемент не существует, «который не будет, если пользователь не войдет в систему», тогда возвращается FALSE и пользователь будет перенаправлен на страницу входа в систему

Как вы думаете?

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

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

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

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

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

 <?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! } } } в <?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 

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

  $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 и проверяем его, когда захотим.

Я надеюсь, что это помогает!

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

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