CodeIgniter: tratando de llamar al método constructor para verificar si el usuario está conectado (causa un bucle de redirección sin fin)

Tengo un problema con CodeIgniter 2.1.2 y me quedo atrapado durante horas tratando de resolverlo: – /

Sé que hay muchos (!) Temas sobre eso, pero no pude encontrar una solución para mi problema.

Quiero cargar un método en mi constructor para verificar si un usuario está conectado, así que intenté esto:

class my_class extends CI_Controller { public function __construct(); parent::__construct(); $this->check(); //doesn't work, endless redirection loop } 

“check ()” es:

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

método “login ()” se ve así:

 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 } 

método “entrada ()”:

 public function entry() { //$this->check();//Old (redundant) Version //Authorized and Happy... } 

// algunos otros métodos, también llaman primero al método check ()

Entonces mi pregunta es, ¿por qué funcionan las llamadas en los métodos (pero con muchas llamadas redundantes) y la llamada en el constructor me da un ciclo infinito? ¿Extraño algo? (Tampoco cambié cosas en los archivos htaccess …)

Thx por adelantado 🙂

Solutions Collecting From Web of "CodeIgniter: tratando de llamar al método constructor para verificar si el usuario está conectado (causa un bucle de redirección sin fin)"

Para explicar lo que los comentaristas han dicho:

Ignorando por MY_Controller solución MY_Controller por un momento, el problema es que su método __construct() y, posteriormente, $this->check() están siendo llamados en cada controlador, incluido su controlador de inicio de sesión.

  1. Cargar la página de inicio El constructor carga el check() .
  2. No ha iniciado sesión. Redirigir a /login .
  3. El constructor de inicio de sesión carga check() .
  4. No ha iniciado sesión. Redirigir a /login .

… y así sucesivamente y así sucesivamente.

La solución es verificar a qué URL se está accediendo , y si pertenece a su controlador / método de inicio de sesión, entonces no realice la redirección.

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

Inversamente, su método de inicio de sesión debería verificar si el usuario ya ha iniciado sesión, y si es así, redirigirlo a su página de inicio o algo así. Pero yo divago.


La solución MY_Controller implica la creación de un controlador base cuyo constructor realiza la verificación de MY_Controller sesión. Entonces, cualquier controlador donde quiera realizar esa verificación debería extender MY_Controller lugar de CI_Controller .

Tenga en cuenta que su controlador de inicio de sesión no extenderá MY_Controller , porque no desea realizar la verificación, o su bucle infinito aparecerá de nuevo.

Es difícil ser preciso, pero aquí va.

Supongo que login () no es un método en la clase / controlador my_class. Si lo son, esta podría ser la causa del error, ya que se llamaría al constructor cada vez.

Un mejor método sería tener un controlador seguro extender CI_Controller, por ejemplo, Auth_Controller. Esto sería en el archivo application / libraries / MY_Controller.php.

Sus controladores seguros extenderían Auth_Controller, y el check () se haría en su contructor. El controlador de inicio de sesión no extendería Auth_Controller.

Aquí hay algunas sugerencias rápidas, pero primero asegúrese de cargar automáticamente la biblioteca de sesión en config / autoload.php

esta no es la clase de inicio de sesión. no tendría una redirección en la clase de inicio de sesión, simplemente iría directamente a $ this-> enterLogin () o cualquiera que sea el nombre del método, para que no se repita.

  // 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; } } //