Php 当codeigniter中未设置会话时,不允许访问控制器中的特定方法

Php 当codeigniter中未设置会话时,不允许访问控制器中的特定方法,php,codeigniter,session,Php,Codeigniter,Session,我希望用户在未设置会话时不要访问控制器的某些方法。为此,我可以在all方法中检查会话,如果设置了会话,则只转到furthur else重定向到特定页面。因为我有很多方法,若并没有设置会话,我不希望用户访问这些方法。它需要遍历所有方法并检查会话。是否有任何捷径可以获得此功能 我尝试检查会话是控制器的构造函数方法,但它适用于所有方法。但若并没有设置会话,我只需要特定的方法来阻止。怎么做 例如: class dashboard extends CI_Controller { function __

我希望用户在未设置会话时不要访问控制器的某些方法。为此,我可以在all方法中检查会话,如果设置了会话,则只转到furthur 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
}

在上面的代码中,当用户转到仪表板控制器时,只要找到“未验证”会话,就会重定向到验证用户控制器。但我想给一些仪表板控制器的方法。不是所有的方法。其中,只要找到会话,此代码就会重定向,并且不允许访问仪表板控制器的任何方法。

如果有帮助,您可以尝试以下方法

在应用程序/核心文件夹中创建一个名为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
        }
    }
}

使用我创建的任何用户名称创建库

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
}
内部控制器

<?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');
        }

    }

检查此选项,它可能会对您有所帮助

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
    */
    }
 }
  • 仅参数:仅针对给定函数/函数存在检查会话
  • 参数除外:不检查给定函数/函数的会话
  • 无参数:检查控制器中所有函数的会话并重定向

  • 您可以根据自己的要求修改用户功能

    您可以这样检查吗?

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

    这不是答案,而是根据我的经验提出的建议:

    作为一名开发人员,如果按照@user1048123上面提到的答案进行操作,那么就很容易了

    但例如,如果您正在访问不需要会话但仍
    function\u required\u user()。这将减慢不需要会话的方法的加载时间。因此,为了更好地检查性能,会话是需要检查会话的方法(在每个方法中)


    这个想法可能更古老,但当您有更多的方法或用户更大时,它确实会影响性能

    添加一些与您的问题相关的代码我添加了与我的问题相关的代码您使用哪个版本的CI???Codeigniter版本2.2在构造函数中检查会话很好,但如果您想访问其他函数的某些会话,则必须对每个函数设置条件。示例
    函数uu-construct(){parent::u-construct();}函数chk\u-login(){if($this->session->userdata('logged_-in')){echo“some action”;}否则{redirect('login');}
    如果我有许多已经生成的方法,那么这个方法会很长。我不想每次都通过方法检查会话。我只想在特定的方法中检查会话。我不明白你的意思-因为我的建议正是你想要的-只要在每个方法中写下你想检查会话的
    if($this->checkUserSession()){..}
    ,这就是我不会在每个方法中都写的。正如问题中提到的,我写了上面的代码。然后我还可以访问像add这样的方法,而不需要会话。同样在表单提交新标签打开后。我需要根据我的要求修改一些代码,它成功地工作了。谢谢,不客气!很高兴听到它成功了!你能分享一下你所做的改变吗?对我来说改变太多了。我必须在'if(count($params['only'])>0&&in_array($action,$params['only'])&&&this->session->userdata('is_login'))变量中嵌套if语句,以检查
    验证的
    会话是否为真并设置。
    
    function __construct()
    {
        parent::__construct();
    }
    
    function chk_login()
    {
        if($this->session->userdata('logged_in'))
        {
             echo "some action";
        }
        else
        {
             redirect('login');
        }
     }