Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Comprobar sesion en el frontController y en la vista?

Estas en el tema de Comprobar sesion en el frontController y en la vista? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, estoy desarrollando un frontController a mi medida basado en el que publica GatorV en su blog, y aplicando el modelo MVC tal ...
  #1 (permalink)  
Antiguo 03/03/2008, 06:01
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Comprobar sesion en el frontController y en la vista?

Hola a todos, estoy desarrollando un frontController a mi medida basado en el que publica GatorV en su blog, y aplicando el modelo MVC tal cual lo propone. Mi duda es la siguiente, las comprobaciones de sesión he de incluirlas en el frontController, entiendo que por lógica sí, además ya sabemos las condiciones del "session_star", pero mi duda es si deberíamos hacer un include de un "session.php" que valide al usuario, en las vistas para que si algún usuario introduce una URL de las vistas directamente se le redirija a la página de login.


EDITO: ¿En los controladores y modelos sería necesario?
Un saludo
  #2 (permalink)  
Antiguo 03/03/2008, 09:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comprobar sesion en el frontController y en la vista?

Lo mejor es validar eso en el controlador especifico, dejale la tarea al frontController de iniciar la aplicación.

El inicio de sesión debe de ser por cada controlador y ahí se debe de hacer la validación del usuario si esta logueado o no.

Trasladado a PHP Orientado a Objetos
  #3 (permalink)  
Antiguo 04/03/2008, 03:38
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Re: Comprobar sesion en el frontController y en la vista?

Cita:
para que si algún usuario introduce una URL de las vistas directamente se le redirija a la página de login
Es que deberia ser imposible que se pueda meter la URL de la vista directamente y que se ejecute algo.

Parte del controlador deberia encargarse de crear un objeto "usuario" a partir de la sesion. Luego se puede pasar ese objeto "usuario" al resto de objetos que necesiten hacer comprobaciones de login o permisos.
  #4 (permalink)  
Antiguo 04/03/2008, 05:11
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Comprobar sesion en el frontController y en la vista?

Hola GatorV,

Te comento como lo estoy haciendo a ver que te parece:
Para controlar las sesiones he pensado lo siguiente: De la clase Controller heredan todos los controladores, por lo que en el constructor de la misma comprobaré sesión y el constructor de la clase hija llamará al del padre:

Código PHP:
<?php
  
class ControllerException extends Exception {}
  class 
Controller {
    function 
__construct(){
      
session_start();
      IF (!isset(
$_SESSION['s_username'])){
        
session_destroy();
        
header("Location: views/login/login.html");
      }
    }
    
    public function 
__call($funcion,$parametro) {
      throw new 
ControllerException('Error fatal, se llamo a una funcion que no esta definida');
    }
  }
?>
Con esto consigo que desde el FrontController cuando se instancia el objeto se haga la validación. ¿Te parece una buena solución?

Por otro lado tengo un problema, adjunto ficheros para que lo veáis más claro.

index.php
Código PHP:
<?php

class FrontControllerException extends Exception {}

class 
FrontController {
  public static function 
Main() {
    
    
//Incluimos el fichero de configuración
    
include 'config/config.php';

    
//Realizamos la conexión a la Base de datos    
    
include $models_dir.'database.php';
    
$db = new database();
    
$db->conectar();
    
    
$dir = isset($_GET['dir'])? $_GET['dir']."/":"";
    
$controller $_GET['controller'];
    
$accion $_GET['accion'];

    if( empty( 
$controller ) ) { // Comprobamos si esta vacia, si asi es definimos que por defecto cargue Index
      
$controller "index";
    }
    if( empty( 
$accion ) ) { // Comprobamos tambien..
      
$accion "index";
    }

    
$controllerFile $controllers_dir $dir $controller "_controller.php";

    if( !
file_exists$controllerFile ) ) { // Si no existe el archivo lanzamos una excepcion
      
throw new FrontControllerException"No se encontro el archivo especificado" );
    }
    else{
      include 
$controllerFile;
    }
  
    
$controllerClass $controller "_controller";

    if(!
class_exists$controllerClasstrue ) ) { // Si existe el archivo pero no esta la clase lanzamos otra excepcion

      
throw new FrontControllerException"El controlador fue cargado pero no se encontro la clase $controllerClass" );
    }
  
      
$controllerInst = new $controllerClass();
   
    if( !
is_callable( array( $controllerInst$accion ) ) ) { // Comprobamos si la accion es posible llamarla
      
throw new FrontControllerException"El controlador no tiene definida la accion $accion" );
    } else {
      
$controllerInst->$accion(); // Llamamos a la accion y dejamos el proceso al controlador

    
}
  }
}
 
// Iniciamos todo
 
FrontController::Main();
 
?>

Controlador de login:
Código PHP:
<?php
  
class login_controller extends controller{
  
    function 
__construct(){
  
//    parent::__construct(); //No es necesario controlar la session
    
}
    
    function 
valida_user(){
      
$username trim($_POST["username"]);
      
$password trim($_POST["password"]);
      
      if (
$username != null AND $password != null) { //Comprobamos que se han rellenado los campos del formulario
        
        
include('models/usuario/usuario_model.php');
        
$user usuario_model::get_usuario($username);
        
        if (!
$user){
        
//Usuario incorrecto
        // header('Location:../html/login.html');
          
echo "Usuario incorrecto";
         }
        else{
          if(
$user->get_pass() != md5($password)){
          
//Usuario correcto, passwd incorrecta
          //  header('Location:../html/login.html');
            
echo "Password incorrecto";
          }
          else{
            
//Usuario y passwd correctos
            
$_SESSION["s_username"] = $username;
            echo 
"Has sido logueado correctamente ".$_SESSION["s_username"]." y puedes acceder al index.php.";
              }      
        }
      }
  
//  include('../html/login.html');
    //header('Location:../html/login.html');
    
}
  }
?>
Usuario_model.php

Código PHP:
  class usuario_model{

    function 
__construct(){
  
    }
    
    function 
get_usuario($p_user){
      
$tipos = array();
      
$parametros = array();
      
$tipos [] = CADENA;
      
$parametros [] = $p_user;
      
$db->consultar(m_usuario_user,$parametros,$tipos );
      
$resul_array $db->consulta2array();
      if(
$resul_array){ 
        
$user = new usuario($resul_array[0]['idUsuario'], $resul_array[0]['user'], $resul_array[0]['pass'], $resul_array[0]['DNI'], $resul_array[0]['nombre'], $resul_array[0]['apellidos'], $resul_array[0]['idOcupacion'], $resul_array[0]['Profesor']);
        return 
$user;
      }
      return 
null;
    }

Al hacer esta llamada desde el navegador "index.php?dir=login&controller=login&accion=valid ar_user"

Hago un include de las variables con los datos de los directorios que declaro en el fichero config.php desde el FrontController e instancio un objeto $db para las conexiones a BD y al hacer el include del controlador y llamar a la función y esta a la del modelo, las variables me dice que no están declaradas(por lo que meto la ruta completa a mano) y el objeto $db desde el Usuario_model.php me dice que no existe, vamos que no hay persistencia de datos al hacer el include o entiendo que por instanciar el objeto no tengo acceso a otras variables "globales", entiendo que el problema es que mi sistema de programación no es el adecuado, ¿cómo lo puedo solucionar?

Se me ocurre por ejemplo crearme una clase "model" y que todos los modelos hereden de esta y esta misma se encarge de instanciar el objeto de BD, pero ¿no será rizar el rizo ya demasiado?

Espero vuestra ayuda, que ando un poco atascado...

Muchas gracias :)
  #5 (permalink)  
Antiguo 04/03/2008, 05:15
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Comprobar sesion en el frontController y en la vista?

Cita:
Iniciado por DarkJ Ver Mensaje
Es que deberia ser imposible que se pueda meter la URL de la vista directamente y que se ejecute algo.

Parte del controlador deberia encargarse de crear un objeto "usuario" a partir de la sesion. Luego se puede pasar ese objeto "usuario" al resto de objetos que necesiten hacer comprobaciones de login o permisos.
DarkJ, si tengo una vista tal que así:
login.html
Código HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head></head><body><form
 action="../../index.php?dir=login&amp;controller=login&amp;accion=valida_user"
 method="post"> <table
 style="border: 1px solid rgb(0, 0, 0);" align="center">
<tbody><tr> <td align="right"> Nombre de
usuario: <input size="15" maxlength="25"
 name="username" type="text"> </td> </tr>
<tr> <td align="right"> Password: <input
 size="15" maxlength="25" name="password"
 type="password"> </td> </tr> <tr> <td
 align="center"> <input value="Login" type="submit">
</td> </tr> </tbody></table>
</form></body></html> 
¿Debería hacerle un include con un fichero donde se comprobase la sesión por si el usuario mete la ruta de la vista directamente? Esa es mi duda..

EDITO: El código que pongo no es una vista como tal. sería una página HTML, creo que no tiene mucho sentido lo que cuestiono aquí. Pero lo anterior sí. Un saludo,

Última edición por Merodeador; 04/03/2008 a las 08:45
  #6 (permalink)  
Antiguo 04/03/2008, 10:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comprobar sesion en el frontController y en la vista?

Te recomendaría para las clases como DB, uses el patrón Singleton, así podrás obtener la instancia de la clase desde cualquier modelo llamando al método getInstance(), asi te despreocupas si tu clase DB esta definida o no.

Saludos.
  #7 (permalink)  
Antiguo 04/03/2008, 16:00
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Comprobar sesion en el frontController y en la vista?

Cita:
Iniciado por GatorV Ver Mensaje
Te recomendaría para las clases como DB, uses el patrón Singleton, así podrás obtener la instancia de la clase desde cualquier modelo llamando al método getInstance(), asi te despreocupas si tu clase DB esta definida o no.
Saludos.
Hola, algo he visto en tu blog también sobre este patrón... Pero, ¿cómo hago para que las variables del fichero config.php, que por ahora son los directorios principales, persistan en la clase instanciada desde el controlador? He de hacer un include nuevamente en la clase controller de este fichero de configuración o existe alguna otra forma...

Muchas gracias a todos por las respuestas.
  #8 (permalink)  
Antiguo 04/03/2008, 17:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comprobar sesion en el frontController y en la vista?

¿Que es lo que guardas en tu archivo de config.php? La idea es que uses el patrón registry para guardar todo en un registro general, la clase registry debe de usar también el patrón Singleton para que puedas consultarlo desde cualquier punto de tu aplicación.

Saludos.
  #9 (permalink)  
Antiguo 05/03/2008, 03:44
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Comprobar sesion en el frontController y en la vista?

Cita:
Iniciado por GatorV Ver Mensaje
¿Que es lo que guardas en tu archivo de config.php? La idea es que uses el patrón registry para guardar todo en un registro general, la clase registry debe de usar también el patrón Singleton para que puedas consultarlo desde cualquier punto de tu aplicación.

Saludos.

Muchas gracias GatorV, voy a ponerme un poco al día con los patrones Singleton y Registry. En el config.php declaraba una seríe de variables con los directorios principales: vistas, modelos y controladores.

Muchas gracias por tu ayuda :)

PD: Si la cosa sigue así, voy a tener que ponerte una dedicatoria en el libro del proyecto :P
  #10 (permalink)  
Antiguo 05/03/2008, 08:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comprobar sesion en el frontController y en la vista?

Aquí estamos para ayudar

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:48.