【问题标题】:Not giving access to certain method in controller when session is not set in codeigniter当在 codeigniter 中未设置会话时,不授予对控制器中某些方法的访问权限
【发布时间】:2015-07-07 06:08:44
【问题描述】:

我希望用户在未设置会话时不要访问控制器的某些方法。为此,我可以检查所有方法中的会话,如果设置了会话,则仅继续前进,否则重定向到特定页面。由于我有很多方法,如果未设置会话,我不希望用户访问。它的大部分内容是通过所有方法和检查会话。有没有捷径可以获取这个功能。

我尝试检查会话是控制器的构造方法,但它适用于所有方法。但是如果没有设置会话,我只想阻止特定的方法。怎么做。

例子:

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 控制器。但我想访问仪表板控制器的某些方法。不是所有的方法。每当找到会话并且不授予对仪表板控制器的任何方法的访问权限时,此代码都会重定向。

【问题讨论】:

  • 添加一些与您的问题相关的代码
  • 我添加了与我的问题相关的代码
  • 你使用哪个 CI 版本???
  • Codeigniter 2.2 版
  • 最好在 constructor 中检查会话,但是如果您想访问其他函数的某些会话,则必须对每个函数设置条件。例如function __construct() { parent::__construct(); } function chk_login(){ if($this->session->userdata('logged_in')){ echo "some action"; }else{ redirect('login'); } }

标签: php codeigniter session


【解决方案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
    */
    }
 }
  1. 仅参数:仅对给定函数/函数存在检查会话
  2. 参数除外:不检查会话中的给定函数/函数
  3. 无参数:检查控制器中所有功能的会话并重定向

你可以根据自己的需求修改_reuired_user函数

【讨论】:

  • 我写了上面的代码。然后我也可以在没有会话的情况下访问 add 之类的方法。同样在打开表单提交新标签后。
  • 我需要根据我的要求修改一些代码,它成功地工作了。谢谢。
  • 不客气!很高兴听到它成功了!你能分享一下你做了什么改变吗?
  • 对我的改变是。我必须在 ` if(count($params['only']) > 0 && in_array($action,$params['only']) && $this->session->userdata('is_login' ))` 变量来检查verified 会话是否为真并设置。
【解决方案2】:

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

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

【讨论】:

  • 如果我已经有很多方法,这个方法很长。我不想每次都通过方法和检查会话。我只想用特定的方法检查会话。
  • 不明白你的意思 - 因为我的建议正是你想要的 - 只需在你想要检查会话的每个方法中写下if ($this->checkUserSession()){....} 就是这样
  • 我不会在每种方法中都写。如问题中所述。
【解决方案3】:

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

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】:

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

    作为开发人员,如果按照上面提到的@user1048123 的回答来完成,那就很容易了。

    但是,例如,如果您正在访问不需要会话的方法(例如:索引),但仍然必须处理 function _required_user() 方法,然后才能显示索引,您必须传递更大的数组(例如:30 个方法在数组名称中)。这将减慢不需要会话的方法的加载时间。因此,为了更好地检查性能,会话是需要检查会话的方法(在每个方法中)。

    这个想法可能较早,但当您拥有更多方法或用户更大时,性能确实很重要。

    【讨论】:

      【解决方案5】:

      你可以这样检查吗?

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

      【讨论】:

        【解决方案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 不满意,它将以NULL 的形式返回$result

        所以在控制器中你可以检查$result是否为空

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 2016-03-23
          • 2021-11-28
          • 1970-01-01
          相关资源
          最近更新 更多