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

Не предоставлять доступ к определенному методу в контроллере, если сеанс не установлен в кодеигниторе

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

Я попытался проверить, является ли метод конструктора контроллером, но он работает для всех методов. Но я хочу, чтобы только специальный метод блокировал, если сеанс не установлен. Как это сделать.

Пример:

class dashboard extends CI_Controller {

 function __construct() {
    parent::__construct();
    $this->load->library('session');
    $this->load->model('dbmodel');
    $this->load->helper('url','form');


    //verified user check
    if($this->session->userdata("unverified") != FALSE) {
        redirect("verify_user");  

    }

    }
    //verified user check
}

Выше кода перенаправляется на контроллер verify_user, как только "непроверенный" сеанс обнаружен, когда пользователь переходит к контроллеру панели управления. Но я хочу предоставить доступ к некоторому методу контроллера панели. Не все методы. Где, когда этот код перенаправляется всякий раз, когда обнаружен сеанс, и не дает доступа к любому методу контроллера панели.

4b9b3361

Ответ 1

Проверьте это. Это может помочь вам

class MY_controller extends CI_controller{
    function __construct() {
        parent::__construct();
    }
    function _required_user($params =array()){
        $action =$this->router->fetch_method();
        if(empty($params['except']))
            $params['except'] =array();
        if(empty($params['only']))
            $params['only'] =array();
        if(count($params['except']) > 0 && in_array($action,$params['except']))
            return true;    
        if(count($params['only']) > 0 && in_array($action,$params['only']) && $this->session->userdata('is_login'))
            return true;
        if($this->session->userdata('is_login'))    
            return true;
        redirect('login');  

    }       
}

class dashboard extends MY_Controller {

  function __construct() {
        parent::__construct();
        $this->load->library('session');
        $this->load->model('dbmodel');
        $this->load->helper('url','form');
        $this->_required_user(array('except'=>array('index')))      
    }
    function add(){
    /*
    Session required
    */  
    }
    function edit(){
    /*
    Session required
    */  
    }
    function index(){
    /*
    no session required
    */
    }
  }

 class content extends MY_Controller{
    function __construct() {
        parent::__construct();
        $this->load->library('session');
        $this->load->model('dbmodel');
        $this->load->helper('url','form');
        $this->_required_user(array('only'=>array('index')))        
    }
    function add(){
    /*
    no Session required
    */  
    }
    function edit(){
    /*
    no Session required
    */  
    }
    function index(){
    /*
    session required
    */
    }
 }  
class Myaccount extends MY_Controller{
    function __construct() {
        parent::__construct();
        /*
        for all functions session required
        */
        $this->_required_user()     

    }
    function edit(){
    /*
    session required
    */
    }
    function save(){
    /*
    session required
    */
    }
 }
  • Только param: check session существует только для заданных функций/функций
  • За исключением параметра: не проверять сеанс для заданных функций/функций
  • No Param: проверка сеанса для всех функций в контроллере и перенаправление

Вы можете изменить функцию _reuired_user в соответствии с вашим требованием

Ответ 2

вы можете попробовать следующее - если это помогает

создайте в своей папке application/core класс с именем MY_Controller что-то вроде

class MY_Controller extends CI_Controller
{

    public function checkUserSession()
    {
        if($this->session->userdata("unverified") != FALSE) 
        {
            redirect("verify_user");
        }
        return true;
    }

}

после этого ваш контроллер панели управления должен выглядеть как

class dashboard extends MY_Controller 
{
    public function show_dashboard()
    {
        if ($this->checkUserSession())
        {
            //your code
        }
    }
}

Ответ 3

Создайте библиотеку с любым именем я created Users.

class Users 
{
    public function __construct()
    {
        $this->ci =& get_instance();
    }

    function _is_logged()
    {
        if(!$this->ci->session->has_userdata('unverified'))
        {
            redirect('verify_user');
        }
    }
}

Загрузите библиотеку или введите ее в автозагрузку в application/config/autoload.php

Затем просто вызовите функцию в верхней части ваших методов, которую вы хотите ограничить.

function abc()
{
    $this->users->_is_logged();
    // your code
}

Ответ 4

можете ли вы проверить это?

function __construct()
{
    parent::__construct();
}

function chk_login()
{
    if($this->session->userdata('logged_in'))
    {
         echo "some action";
    }
    else
    {
         redirect('login');
    }
 }

Ответ 5

Это не ответ, а предложение, основанное на моем опыте:

Как разработчик, это легко сделать, как и в вышеупомянутом ответе @user1048123.

Но, например, если вы обращаетесь к методу (ex: index), для которого сеанс не нужен, но метод function _required_user() должен обрабатываться до того, как индекс будет отображаться там, где вам нужно передать более крупный массив (например: 30 методов в имени массива). Это замедлит время загрузки методов, для которых сеанс не нужен. Поэтому для лучшей проверки производительности сеанс - это метод (в каждом методе), для которого необходимо проверить сеанс.

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

Ответ 6

В контроллере

<?php
    class dashboard extends CI_Controller {

        function __construct()
        {
            parent::__construct();
            $this->load->library('session');
            $this->load->model('dbmodel');
            $this->load->helper('url','form');


        }

        public function index()
        {
            $user = $this->session->userdata("unverified")//asign session value to variauble
            $result = $this->dbmodel->check_user($user);//check user validity

        if(empty($result))
        {
            //user is not verified
            $this->load->view('unverified_loging');
        }
        else
        {
            //user is verified
            $this->load->view('verified_loging');
        }

    }

В модели

    public function check_user($user)
    {
        $query = $this->db->query("SELECT * FROM user WHERE <argument here>");//check with database
        $result = $query->result_array();
        return $result;

    }

Если пользователь удовлетворен пользователем validity, он передает данные в $result. Если он не удовлетворен validity, он вернет $result как NULL.

Итак, в контроллере вы можете проверить, является ли $result пустым или нет