CodeIgniter: проверка входа пользователя в систему на нескольких страницах - PullRequest
22 голосов
/ 07 мая 2011

У меня есть контроллер, который отображает раздел моего сайта, и все страницы в нем (методы) должны отображаться, только если пользователь вошел в систему. В противном случае они должны быть перенаправлены обратно на экран входа в систему.1002 * Чтобы заставить его работать, я только что сделал это:

function index() {

    if ($this->session->userdata('logged_in')) {
        $this->load->view('main');

    } else {
        redirect('/login');
    }
}

function archive() {

    if ($this->session->userdata('logged_in')) {

и так далее ... повторяя эту проверку в каждом методе.Какой самый простой способ выполнить эту проверку один раз для нескольких или всех методов в контроллере?

Ответы [ 4 ]

45 голосов
/ 07 мая 2011

Вы можете запустить код в каждом методе контроллера, запустив его в методе __construct():

function __construct()
{
    parent::__construct();
    if ( ! $this->session->userdata('logged_in'))
    { 
        // Allow some methods?
        $allowed = array(
            'some_method_in_this_controller',
            'other_method_in_this_controller',
        );
        if ( ! in_array($this->router->fetch_method(), $allowed)
        {
            redirect('login');
        }
    }
}

Вы можете удалить «разрешенные» биты, если хотите ограничить доступ ко всему объекту, но есть лучшие способы сделать это, например, создать базовый контроллер:

// Create file application/core/MY_Controller.php
class Auth_Controller extends CI_Controller {

    function __construct()
    {
        parent::__construct();
        if ( ! $this->session->userdata('logged_in'))
        { 
            redirect('login');
        }
    }
}

Затем ваши ограниченные контроллеры расширяют Auth_Controller вместо CI_Controller.Теперь ваш код будет запускаться каждый раз при загрузке контроллера.

Дополнительная информация о расширении базовых классов: http://www.codeigniter.com/user_guide/general/core_classes.html#extending-core-class

Также представляет интерес: http://php.net/manual/en/language.oop5.decon.php

5 голосов
/ 08 июля 2015

Для codeIgniter 3 я изменил ответ Уэсли Мерча на это

// Создать файл приложения / core / MY_Controller.php

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Controller extends CI_Controller {

function __construct()
{
    parent::__construct();
    $CI = & get_instance();
    $CI->load->library('session');
    $CI->load->helper('url');
    if ( !$this->session->userdata('logged_in'))
    { 
        redirect('login');
    }
}

}

Затем в любом контроллере для проверки авторизации я использовал

Класс News extends MY_Controller {// code here}

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

<code>function __construct() {
    parent::__construct();
    $CI = & get_instance();
    $CI->load->library('session');
    $CI->load->helper('url');
   // echo "<pre>";print_r($this->router);echo "
"; / ** * если веб-мастер затем проверяет сеанс администратора, еще проверяет сеанс пользователя * Но может быть метод некоторых классов, который не 't требует входа в систему, следовательно, также необходимо проверить, является ли * текущий запрос для этих методов, перед проверкой сессии * / // использовать $ this-> config-> item ('webmaster_name'), это вы должны определить // $ config ['webmaster_name'] = "webmaster"; в файле config.php if ($ this-> router-> module == $ this-> config-> item ('webmaster_name'))) {if (! $ this-> session-> userdata ('admin') ['id']) {redirect ($ this-> config-> item ('Webmaster_name') '/ Войти').}} else {if (! $ this-> session-> userdata ('user') ['id']) {redirect ('login');}}}

Если вы также хотите, чтобы пользователи разрешали доступ к некоторым методам с любого конкретного контроллера без входа в систему, вы можете использовать этот код -

<code>function __construct() {
    parent::__construct();
    $CI = & get_instance();
    $CI->load->library('session');
    $CI->load->helper('url');

    //echo "<pre>"; print_r($this->router);echo "
"; // _ pr ($this-> config-> item ('exclusive_auth')); / ** * если веб-мастер затем проверяет сеанс администратора, иначе проверяет сеанс пользователя * Но может быть метод некоторых классов, который не требует входа в систему, следовательно, также необходимо проверить,* текущий запрос для этих методов перед проверкой сеанса * / if ($ this-> router-> module == $ this-> config-> item ('webmaster_name'))) {if (! $ this-> session-> userdata('admin') ['id']) {redirect ($ this-> config-> item ('webmaster_name'). '/ login');}} else {if (array_key_exists ($ this-> router-> class, $ this-> config-> item ('exclude_auth')) && in_array (метод $ this-> router->, $ this-> config-> item ('exclude_auth') [$ this-> router-> class])) {// echo "экранировать этот метод.Не проверять для сеанса ";} else {if (! $ this-> session-> userdata ('user') ['id']) {redirect ('login');}}}}

Примечание: Вы можете определить пользовательский файл конфигурации для определения исключенных методов, таких как as-

//save file in application/config/without_auth_methods.php

<?php
     defined('BASEPATH') OR exit('No direct script access allowed');
     $config['exclude_auth']['news']       = array('index', 'view');
     $config['exclude_auth']['users']      = array('index');
1 голос
/ 05 апреля 2012

Я использую эту функцию:

Затем просто вызовите $ this-> isAuthorized из ваших контроллеров __construct.

Это позволяет мне контролировать доступ к контроллерам и к каким методам тоже.

protected function isAuthorized()
{

    switch ( strtolower( $this->router->class ) )
    {
        case 'pages':
            $disallowLoggedOut = array( 'dashboard' );
            $disallowLoggedIn = array( 'index' );
        break;

        case 'users':
            $disallowLoggedOut = array( 'logout' );
            $disallowLoggedIn = array( 'register', 'login' );
        break;
    }

    if ( $this->session->userdata( 'loggedIn' ) ) 
    {       
        if ( in_array( $this->router->method, $disallowLoggedIn ) )
        {
            redirect( 'pages/dashboard' );
        }
    }
    else
    {       
        if ( in_array( $this->router->method, $disallowLoggedOut ) )
        {
            redirect( 'pages/index' );
        }
    }
}
0 голосов
/ 25 апреля 2018

Лучший способ решить эту проблему - создать пользовательский помощник, который должен вызываться в каждом методе класса контроллера, например, Перейти к приложению / помощникам и создать файл login_helper.php Вставить следующий код в помощник

<?php
 defined('BASEPATH') OR exit('no direct access');

 function isLogin($sessionType)
 {
   if(empty($_SESSION[$sessionType]))
         redirect(base_url('loginURL'));
 }

?>

Теперь загрузите этот помощник в конструктор контроллера.

application/controllers/Access.php

таким образом

defined('BASEPATH') OR exit('access denied');
class Access Extends CI_Controller
{
  funcrion __construct()
  {
    parent::__construct();
    $this->load->helper('login');
  }
  function home()
  {
    isLogin();
    $this->load->view('home_page);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...