Miércoles, 14 Marzo 2012 00:15

VT 08 PHP:POO+MVC - Crear un framework básico

Escrito por  Jaisiel Delance

Continuamos el trabajo con el control de acceso y el control del tiempo de la sesión.

Descargar este Vídeo | Descargar código fuente

7 comentarios

  • Enlace al Comentario José L. Lunes, 09 Marzo 2015 20:27 publicado por José L.

    Muy bueno todo.

    Eres un crack.

  • Enlace al Comentario Julio Fuentes Viernes, 16 Marzo 2012 03:13 publicado por Julio Fuentes

    Gracias Delance por este otro material, muy bueno la verdad, ya vendre con mas dudas, pero igual queria felicitarte antes por esta otra entrega.

    A Carlos Martinez, yo estuve en la misma situacion que tu, desarrollando un proyecto que necesitaba archivos con permisos especificos y que un administrador pudiera dar estos permisos y quitarlos por cada uno de ellos.

    Ejemplo:

    mi Aplicacion tendria 3 secciones (Yo los llamo modulos) y dentro de estas secciones varias aplicaciones, como noticias, comentarios, y foro.

    Hardware
    |- Noticias
    |- Foro
    |- Comentarios

    Software
    |- Noticias
    |- Foro
    |- Comentarios

    Network
    |- Noticias
    |- Foro
    |- Comentarios


    El administrador por supuesto tenia acceso a todo y a dar y quitar permisos a los demas usuarios.

    La forma que se me ocurrio y comento desde ya, que no tenia otra y fue la que se me ocurrio a mi en particular si esta bien o no, no lo se pero me funciono muy bien.

    Lo diseñe con sistema de bits. y me quedo asi

    Hardware - 1
    Software - 2
    Network - 4
    Futuro..n - 16
    Futuro..n - 32
    Futuro..n - 64
    Futuro..n - 128
    Futuro..n - 256

    y Dentro de cada modulo igual mas accessos con bits

    Hardware - 1
    |- Noticias -1
    |- Foro - 2
    |- Comentarios - 4
    |- Futuro - 8
    |- Futuro - 16
    |- Futuro - 64

    Software - 2
    |- Noticias - 1
    |- Foro - 2
    |- Comentarios - 4
    |- Futuro - 8
    |- Futuro - 16
    |- Futuro - 64

    Network - 4
    |- Noticias - 1
    |- Foro - 2
    |- Comentarios - 4
    |- Futuro - 8
    |- Futuro - 16
    |- Futuro - 64

    entonces cada usuario tiene un modulo access y un level access dentro de ese modulo. Sumaba los bits y asi sabia a que tenia acceso y a que no, mi tabla quedaba asi

    user | module | hardware | software | network |
    -------------------------------------------------------------------
    1 | 3 | 7 | 2 | 0 |
    -------------------------------------------------------------------
    2 | 4 | 0 | 0 | 7 |
    ------------------------------------------------------------------

    Aqui por ejemplo mi usuario 1 tiene acceso a los modulos Harware y Software porque el valor de modulo es 3

    1 + 2 =3

    No podria acceder a Network

    y dentro de Hardware el tenia acceso 7 los 3 permisos que tenia configurador

    noticias 1 + foro 2 + comentarios 3 = 7

    despues comprobaba cuando el Usuario se loegueba y lo guardaba en una variable de Session.

    $_SESSION['userId'] = 1
    $_SESSION['module'] = 3

    y le chequeaba que si tenia 3 ya sabia que tendria el modulo uno y dos y hacia un query en el modulo Hardware y el Software a ver que nivel tenia dentro de ese modulo para dejarlo comentar, ver el foto, o noticias, segun su nivel.

    if($_Session['module'] & 1 )
    queryHardware = "SELECT hardware FROM table where user = userID"

    en la pagina de hardware noticias chequeaba si tenia ese nivel

    function checkHardwareLevel
    if(queryHard & 1)
    PASA;
    else
    ACCESS DENIED;
    y Asi ocn todos los demas modulo y permisos dentro de los modulos.

  • Enlace al Comentario NicoM Jueves, 15 Marzo 2012 18:28 publicado por NicoM

    Seria posible que postees el dump de la base de datos?

  • Enlace al Comentario Jaisiel Delance Jueves, 15 Marzo 2012 14:27 publicado por Jaisiel Delance

    Pensé que te referias a traer los datos de los roles desde una base de datos.

    Para hacerlo desde un gestor de permisos:

    Puedes tener una tabla para los roles y crear un id de roles por cada metodo o controlador o puedes definir un id de role para un grupo de controladores o metodos que compartan las mismas restricciones y enviar este id en el metodo "Session::acceso($id)" (ya sea el id de un solo metodo o controlador o el id de un grupo) para que aplique la restriccion definida en el registro de ese metodo o controlador, si es un controlador llamas el metodo acceso en el constructor y le pasas el id.

    De esta forma puedes manipular de forma independiente la restriccion de cada controlador o metodo de tu aplicación.

    Excelente pregunta.

    Saludos

  • Enlace al Comentario Carlos Martinez Heranz Miércoles, 14 Marzo 2012 22:40 publicado por Carlos Martinez Heranz

    Hmm, no lo entiendo, ¿ con simplemente eso el admin seria capaz de cambiar los privilegios para un rol en especifico, por ejemplo que no pueda añadir posts ?

    Yo quiero hacerlo para que el admin pueda administrarlo y cambiarlo desde la interfaz, configurable, que pueda configurar y cambiar los privilegios especificos para cada rol y asignar roles a usuarios.

    Tendriamos las tablas de Roles, Rol_usuario y Usuarios, entre otras. Y la tabla roles contendria registros con Id y los privilegios especificos para ese id, las columnas serian ID, nombre del rol, Controlador1-metodo1, controlador1-metodo2, controlador1-metodo3, controlador2-metodo1... que serian booleanos true o false para saber si con ese rol se tiene acceso a cada controlador-metodo.

    No lo tengo muy claro y te preguntaba por si sabias, asi me echas un gran cable y le puede ayudar a la gente que por aqui se pase.

    Un abrazo!!!

  • Enlace al Comentario Jaisiel Delance Miércoles, 14 Marzo 2012 19:26 publicado por Jaisiel Delance

    Para lograr esto basta con crear una tabla de accesos y cambiar unas lineas del metodo getLevel(), este seria tu nuevo metodo:

    public static function getLevel($level)
    {
    $db = new Database();
    $consulta = $db->query("SELECT * FROM accesos");
    $role = $consulta->fetchAll();

    for($i = 0; $i < count($role); $i++){
    if(in_array($level, $role[$i])){
    return $role[$i]['nivel'];
    }
    }

    throw new Exception('Error de acceso');
    }

    te creas una tabla de accesos con al menos 3 campos:
    1.- id,
    2.- grupo o acceso
    3.- nivel

  • Enlace al Comentario Carlos Martinez Heranz Miércoles, 14 Marzo 2012 14:32 publicado por Carlos Martinez Heranz

    Muy bien! genial! pero creo que todos te agradeceriamos irias un pequeño paso mas alla.

    En tus ejemplos controlas el acceso y defines el acceso en los metodos de los controladores o en las vistas. Pero mi duda y creo que la de muchos es, ¿ de que manera implementarias el framework para que el admin pueda definir este nivel de acceso y guardarlo en la base de datos ? ¿ como recuperariamos el nivel de acceso de un metodo para ver si el usuario actual puede usar dicho metodo ?

    ¿ Como se haria ? cuando el usuario se autenticara, nos traeriamos todos los privilegios de cada controlador y sus metodos de la base de datos ( que esto podria ser un array con keys controlador-metodo y value true/false ) y lo guardariamos en la variable de $_Session, de esta forma cada vez que el usuario intente usar un metodo, comprobariamos de la variable de $_Session si tiene privilegio o no, es decir, si true o false, en vez de por niveles. ¿ o como Jaisiel ?

    Este tema es muy pero que muy interesante. Por favor Jaisiel. Ayudanos. Tomate tu tiempo, pero cuando puedas por favor, intenta hacer un pequeño video explicando esto.

    Un saludo y gracias.

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el Código HTML.

hosting joomla