Как правильно защитить приложение CodeIgniter 2 с помощью аутентификации?
У меня есть Ионная Авторизация правильно установлен и работает на моем сервере. У меня также есть учебник по умолчанию CodeIgniter 2 "новости", работающий в той же установке CI. Я просто играю и интересуюсь, как правильно использовать систему аутентификации для "закрытия" или защиты всего приложения.
Для этого вопроса давайте воспользуемся учебником "новости", который поставляется с CI.
Внутри функции index()
в моем контроллере news.php
я добавил условный код для проверки, вошел ли пользователь в систему. Если нет, пользователь просто переходит на экран входа в систему.
public function index() {
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
if ($this->ion_auth->logged_in()) {
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
} else {
redirect('auth/login', 'refresh');
}
}
Я вижу, что это работает, но непосредственным недостатком является то, что каждая функция в контроллере также должна быть изменена с помощью аналогичной условной логики для защиты всех других просмотров страниц. например, - проверьте наличие входа, отобразите страницу, или перейдите на страницу входа... снова и снова.
Так ли это должно быть сделано?
Что делать, если приложение уже создано и работает и кто-то просто хочет защитить все это? Добавление условной логики для проверки статуса входа в систему при каждом просмотре отдельной страницы в контроллере кажется излишне подробным.
Можно ли защитить все приложение (все представления) в одном месте, чтобы свести к минимуму изменение кода? Если да, то как?
3 answers
Чтобы защитить весь контроллер, вы можете включить проверку подлинности в вызов __construct()
, как упоминал эрик.ицхак.
Чтобы защитить все приложение, вы можете расширить класс CI_Controller, поместить аутентификацию в конструктор этого файла, а затем, наконец, расширить с помощью MY_Controller вместо CI_Controller в каждом из ваших контроллеров.
Примеры кода:
/* File: application/core/MY_Controller.php */
class MY_Controller extends CI_Controller
{
function __construct()
{
parent::__construct();
if ( ! $this->ion_auth->logged_in())
{
redirect('auth/login');
}
}
}
И затем в каждом контроллере (обратите внимание на MY_Controller, а не на CI_Controller):
class Controller_name extends MY_Controller
{
function __construct()
{
parent::__construct();
}
// rest of controller methods
}
Эти примеры кода предположим, вы автоматически загружаете (вы также можете) библиотеку аутентификации ion. Если нет, загрузите библиотеку в файл MY_Controller
по мере необходимости.
У этого метода есть два преимущества:
- Вам нужно только изменить CI-контроллер на MY_Controller в каждом контроллере, который вы хотите защитить.
- Вам не нужно защищать все, что полезно, если вам нужен незащищенный контроллер, т.Е. контроллер, содержащий методы аутентификации (вы не сможете войти в систему, если ваш контроллер аутентификации требует, чтобы вы вошли в систему: P - будет цикл перенаправления).
Конструктор - это правильный путь. Есть еще кое-что, о чем стоит подумать - это будет более гибко, если вы вызовете свой собственный метод вместо прямого ионного аутентификации. обычно частью процесса входа в систему является получение уникальных значений, отображаемых в представлении, или идентификатора, используемого для отслеживания сеанса и т. Д. И т. Д. Пример: покажите имя пользователя на странице.
Так что перенесите проверку авторизации ion в модель, добавьте метод получения информации о пользователе или все, что вам нужно. для каждого метода возвращаемый ложно, если это не сработает. а затем в вашем конструкторе проверьте, было ли оно возвращено
function __construct() {
parent::__construct();
// load the model
$this->load->model( 'customer_model' );
// if logged in, return $this->customer, available to all methods in class
if(! $this->customer = $this->customer_model->verifyLogin() )
{ redirect('auth/login', 'refresh'); }
}
public function index()
{
// pass customer to data
$data['customer'] = $this->customer ;
// $customer->name will now be available in view
}
Я думаю, что правильной логикой было бы проверять статус пользователя внутри метода __construct
, как это будет делаться при каждом использовании контроллера. это не будет защищать все приложение ci, только методы в этом контроллере, но я думаю, что это подойдет для вашего случая.
Попробуйте это:
public function __construct()
{
if (!$this->ion_auth->logged_in())
redirect('auth/login', 'refresh');
}