Я создал регистрацию и логин для своего веб-сайта, и вся проверка достоверна для регистрации и входа в систему. После того, как пользователь предоставит действительные учетные данные, он / она регистрируется в области участников с приветственным сообщением, в котором говорится 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-> ограничение ();