Как правильно защитить приложение 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');
    }
}

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

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

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

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

Author: Sparky, 2012-11-30

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 по мере необходимости.

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

  1. Вам нужно только изменить CI-контроллер на MY_Controller в каждом контроллере, который вы хотите защитить.
  2. Вам не нужно защищать все, что полезно, если вам нужен незащищенный контроллер, т.Е. контроллер, содержащий методы аутентификации (вы не сможете войти в систему, если ваш контроллер аутентификации требует, чтобы вы вошли в систему: P - будет цикл перенаправления).
 9
Author: Brendan, 2012-11-30 04:11:02

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

Так что перенесите проверку авторизации 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


 } 
 2
Author: cartalot, 2012-12-01 01:52:58

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

Попробуйте это:

 public function __construct()
   {

        if (!$this->ion_auth->logged_in()) 
             redirect('auth/login', 'refresh');
   }
 1
Author: eric.itzhak, 2012-11-29 23:09:27