У меня 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
мере необходимости.
Существует два преимущества этого метода:
Конструктор – это путь. Что-то еще, о чем нужно подумать – это будет более гибким, если вы вызовете свой собственный метод вместо 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'); }