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