1

我遇到了 CodeIgniter 2.1.2 的问题并坚持了几个小时尝试解决它:-/

我知道有很多(!)关于这个的线程,但我找不到我的问题的解决方案。

我想在我的构造函数中加载一个方法来检查用户是否登录,所以我尝试了这个:

class my_class extends CI_Controller
{
public function __construct();
parent::__construct();

$this->check(); //doesn't work, endless redirection loop
}

“检查()”是:

public function check()
{
    if (! $this->session->userdata('logged_in'))  
    {     
        redirect('/login'); // tried with & without '/'
    }
}

方法“login()”如下所示:

public function login()
{
  ...
  //do form validation stuff and on success:
  if ($this->form_validation->run() == TRUE)
    {
     $this->session->set_userdata('logged_in', TRUE);
     redirect('/entry'); 
    }
   //load login_view
}

方法“入口()”:

public function entry()
{
  //$this->check();//Old (redundant) Version

  //Authorized and Happy...
}

// 其他一些方法,也先调用check()方法

所以我的问题是,为什么方法中的调用有效(但有很多冗余调用)并且构造函数中的调用给了我一个无限循环?我错过了什么吗?(我也没有更改 htaccess 文件中的内容..)

提前谢谢:-)

4

3 回答 3

2

详细说明评论者所说的话:

暂时完全忽略MY_Controller解决方案,问题是您的__construct()方法 - 以及随后$this->check()- 在每个控制器上都被调用,包括您的登录控制器。

  1. 加载主页。构造函数加载check()
  2. 未登录。重定向到/login
  3. 登录构造函数加载check()
  4. 未登录。重定向到/login

... 等等等等。

解决方案是检查正在访问的 URL,如果它属于您的登录控制器/方法,则不要执行重定向。

public function check()
{
    if ($this->uri->uri_string() !== 'login' && ! $this->session->userdata('logged_in'))
    {     
        redirect('login');
    }
}

相反,您的登录方法应该检查用户是否确实已经登录,如果是,则将他重定向到您的主页或其他地方。但我离题了。


MY_Controller解决方案涉及创建一个基本控制器,其构造函数执行登录检查。然后,您想要执行该检查的任何控制器都应该扩展MY_Controller而不是CI_Controller.

请注意,您的登录控制器不会扩展MY_Controller,因为您不想执行检查,否则您的无限循环将再次出现。

于 2013-03-15T01:56:11.377 回答
0

这很难准确,但这里有。

我假设 login()不是my_class 类/控制器中的方法。如果是,这可能是错误的原因,因为每次都会调用构造函数。

更好的方法是让安全控制器扩展 CI_Controller,例如 Auth_Controller。这将在 application/libraries/MY_Controller.php 文件中。

您的安全控制器将扩展 Auth_Controller,并且 check() 将在其构造函数中进行。登录控制器不会扩展 Auth_Controller。

于 2013-03-14T16:16:04.997 回答
0

这里有一些快速的建议,但首先要确保在 config/autoload.php 中自动加载会话库

这不是登录类。您不会在登录类中有重定向,您只需直接转到 $this->enterLogin() 或任何方法名称,这样它就不会循环。

 // Capitalize the first letter of the class!!
 class My_class extends CI_Controller
 {
     public function __construct();
     parent::__construct();

     // check if login is false
     // redirect here in the constructor, not buried in a method
     // note the underscore in the name _checkLogin() to make that method private

     if ( $this->_checkLogin() == false ) 
    { redirect( '/login/', 'refresh' );  }

 } // end constructor


 // private function 
 function _checkLogin(){
    if (! $this->session->userdata('logged_in'))  
    {   return false ;  }
    else
    { return true; } 

  } // 
于 2013-03-14T18:01:35.180 回答