Каков надлежащий способ защиты приложения CodeIgniter 2 с аутентификацией?

У меня Ion Auth правильно установлен и работает на моем сервере. У меня также есть учебник «Новости» 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'); } } 

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

Так ли это должно быть сделано?

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

Можно ли защитить все приложение (все виды) в одном месте, чтобы свести к минимуму модификацию кода? Если да, то как?

Чтобы защитить весь контроллер, вы можете поместить проверку аутентификации в вызов __construct() как упомянутый eric.itzhak.

Чтобы защитить все приложение, вы можете расширить класс CI_Controller, поместить auth в конструктор этого файла, а затем, наконец, расширить 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 } 

Эти примеры кода предполагают, что вы автоматически загружаете (вы также можете) библиотеку иона. Если нет, загрузите библиотеку в файл MY_Controller мере необходимости.

Существует два преимущества этого метода:

  1. Вам нужно только изменить CI_Controller на MY_Controller на каждом контроллере, который вы хотите защитить.
  2. Вам не нужно защищать все, что полезно, если вам нужен незащищенный контроллер, то есть контроллер, содержащий методы auth (вы не сможете войти в систему, если ваш контроллер авторизации требует, чтобы вы вошли в систему: P – будет цикл переадресации).

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

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

 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'); }