Подтвердить что ты не робот

CodeIgniter: проверка, зарегистрирован ли пользователь для нескольких страниц

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

Чтобы заставить его работать, я только что сделал это:

function index() {

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

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

function archive() {

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

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

4b9b3361

Ответ 1

Вы можете запускать код в каждом методе Контроллера, запустив его в методе __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

Ответ 2

Для CodeIgniter 3 я изменил Wesley Murch на этот

//Создание файлового приложения /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');
    }
}

}

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

class News extends MY_Controller { // код здесь }

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

function __construct() {
    parent::__construct();
    $CI = & get_instance();
    $CI->load->library('session');
    $CI->load->helper('url');
   // echo "<pre>";print_r($this->router);echo "</pre>";

    /**
     * if webmaster then check admin session else check user session
     * But there may be some classes method that doesn't requires login hence it is also need to check if
     * current request is for those methods before checking session
     */
    //to use $this->config->item('webmaster_name') this you have to define 
    // $config['webmaster_name'] = "webmaster"; in config.php file

    if ($this->router->module == $this->config->item('webmaster_name')) {
        if (!$this->session->userdata('admin')['id']) {
            redirect($this->config->item('webmaster_name').'/login');
        }
    } else {
        if (!$this->session->userdata('user')['id']) {
            redirect('login');
        }
    }
}

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

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

    //echo "<pre>"; print_r($this->router);echo "</pre>"; //_pr($this->config->item('excluded_auth'));
    /**
     * if webmaster then check admin session else check user session
     * But there may be some classes method that doesn't requires login hence it is also need to check if
     * current request is for those methods before checking session
     */
    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->method, $this->config->item('exclude_auth')[$this->router->class])) {
            //echo "escape this method. don not validate for a session";
        } else {
            if (!$this->session->userdata('user')['id']) {
                redirect('login');
            }
        }
    }
}

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

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

Ответ 3

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

Затем просто вызовите $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' );
        }
    }
}