Uso de Hooks en CodeIgniter dudas .

padawanluke Seguir

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
Que tal, estoy aprendiendo a usar CodeIgniter , en el manual vi para que sirve los Hooks, y se me ocurrio una idea y es para agregar una funcionalidad de seguridad para acceso a paginas restringidas.
Es decir antes cuando programaba todo desde cero en PHP , cuando creaba un sistema de login de usuarios para impedir el acceso a una pagina restringida agregaba una capa de seguridad mediante un archivo que lo incluia en cada pagina que tenia que ser restringida, de esta manera se validaba si existia la session y lo dejaba entrar o lo redireccionaba a una pagina de login, mediante hooks me parecio bueno usar el pre_controller_construct que es cuando se ejecuta un controlador pero sin cargar ningun metodo, entonces en ese momento es para chequear si esta logeado o no, pero tengo un problema, esta validacion es para toda la aplicacion inclusive para el mismo formulario de login, entonces no me sirve , podria fijarme que solo para el formulario de login no haga la validacion, pero asi y todo tampoco me sirve ya que no solo la pagina de login tendria que estar excenta sino muchas otras mas .

Este es el codigo que tengo en Hooks.php en la carpeta config :

PHP:
$hook['post_controller_constructor'] = array(
                                'class'    => 'Login',
                                'function' => 'validar_login',
                                'filename' => 'login.php',
                                'filepath' => 'hooks'
                                );

en la carpeta hooks cree un archivo login.php el cual tiene un metodo validar_login() que chequea si existe la session.

PHP:
<?php
if (!defined( 'BASEPATH')) exit('No direct script access allowed'); 
class Login
{
	private $ci;
	public function __construct()
	{
		$this->ci =& get_instance();
		!$this->ci->load->library('session') ? $this->ci->load->library('session') : false;
		!$this->ci->load->helper('url') ? $this->ci->load->helper('url') : false;
	}	

	public function validar_login()
	{

		if($this->ci->uri->segment(1) == 'login' && $this->ci->session->userdata('id') == true)
        {

            redirect(base_url('inicio'));

        }else if($this->ci->session->userdata('id') == false && $this->ci->uri->segment(1) != 'login')
        {

        	redirect(base_url('login'));

        }
	}
}

En este codigo basicamente lo que chequeo es que la session exista, y hago la salvedad que en caso de que se trate del login no lo haga.

Pero no pudo hacer un IF por cada pagina que quiero dejar excenta de esta validacion .

Mi pregunta es si hay alguna manera de elegir que paginas validar y cuales no de una manera mejor, o si simplemente tengo que volver a validar mediante un metodo en cada pagina que quiera restringir?

Espero que se haya entendido, sino trataré de explicarme mejor.

Saludos.
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
No es necesario usar ningun hook, create un base controller propio que extienda del controller default de codeigniter y despues a todos tus controllers hacelos extender de tu base controller.

En el base controller, en el metodo init hace la validacion de usuario.
Despues en los controllers que necesites validacion de usuario simplemente no creas el init o si lo crear para hacer cosas extra, al final llamas al init del padre. Y en los controllers que no necesites validacion simplemente sobreescribis el init sin llamar al del padre.

Favrik: A base controller for CodeIgniter

O si en un controller vas a tener actions publicas y privadas mezcladas, en el base controller haces una funcion para validar si el usuario esta logueado y despues en tus controllers simplemente llamas a esta funcion cada vez que la necesites.
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
No es necesario usar ningun hook, create un base controller propio que extienda del controller default de codeigniter y despues a todos tus controllers hacelos extender de tu base controller.

En el base controller, en el metodo init hace la validacion de usuario.
Despues en los controllers que necesites validacion de usuario simplemente no creas el init o si lo crear para hacer cosas extra, al final llamas al init del padre. Y en los controllers que no necesites validacion simplemente sobreescribis el init sin llamar al del padre.

Favrik: A base controller for CodeIgniter

O si en un controller vas a tener actions publicas y privadas mezcladas, en el base controller haces una funcion para validar si el usuario esta logueado y despues en tus controllers simplemente llamas a esta funcion cada vez que la necesites.

Entendí muy a medias lo que me dijiste, recien estoy empezando con codeigniter, voy a ver el lin que me pasaste para ver como es un base controller, teoricamente entiendo lo que decis, pero no se como desarrollarlo .

Igual gracias.
 

olal28

Gamma
Programador
Verificado por Whatsapp
Desde
8 Dic 2009
Mensajes
432
Según recuerdo, se podía excluir los hooks a controladores específicos. Puedes obtener el nombre del controlador actual y si es igual a tu controlador de login hacer return para que el hook de seguridad no se ejecute.

$CI =& get_instance();
if($CI->router->class == 'class_to_exclude') {
return;
}

// Do things
 
Arriba