笨:试图调用构造函数方法来检查,如果用户登录(导致无休止的循环重定向)(CodeIgniter: t

2019-10-17 19:59发布

我有一个问题,笨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 '/'
    }
}

方法“登录()”是这样的:

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...
}

//一些其它方法中,也首先调用校验()方法

所以我的问题是,为什么在方法作品(但很多重复的调用),并在构造函数中调用的电话给我一个无限循环? 难道我错过了什么? (我也是在htaccess的文件并没有改变的东西..)

THX提前:-)

Answer 1:

要阐述什么评论者说:

忽略MY_Controller完全解决了一会儿,问题是,你的__construct()方法-随后, $this->check() -被称为每个控制器上,包括你的登录控制器。

  1. 加载网页。 构造负荷check()
  2. 没有登录。重定向到/login
  3. 登录构造负荷check()
  4. 没有登录。重定向到/login

... 等等等等。

解决的办法是检查被访问网址是什么 ,如果它属于你的登录控制器/方法,那么不执行重定向。

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

相反,你的登录方法应该检查用户是否确实已经登录,如果是这样,他重定向到您的主页或东西。 但是,我离题。


MY_Controller解决方案涉及创建一个基本控制器 ,其构造进行登录的检查。 然后,要执行检查任何控制器应扩大MY_Controller而非CI_Controller

请注意,您登录控制器不会延长MY_Controller ,因为你不希望执行检查,或者你的无限循环将再次出现。



Answer 2:

这是很难做到准确,但在这里不用。

我假定登录() 不在 my_class类/控制器的方法。 如果是这样,这可能是错误的原因的构造函数每次被调用。

更好的方法是将有一个安全控制器扩展是CI_Controller,如Auth_Controller。 这将是在应用程序/库/ MY_Controller.php文件。

您的安全控制器将扩大Auth_Controller和检查()将在其构造器中进行。 登录控制器不会扩大Auth_Controller。



Answer 3:

这里有一些简单建议,但首先要确保你的config / autoload.php自动加载会议库

这是不是在登录类。 你就不必在登录类重定向,你只需直接进入这个 - $> 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; } 

  } // 


文章来源: CodeIgniter: trying to call constructor method to check if user is logged in (causes endless redirection loop)