[POO]Sistema de usuario y privilegios

Iniciado por jperezmonge, 17 Abril 2012, 13:53 PM

0 Miembros y 2 Visitantes están viendo este tema.

jperezmonge

Pues resulta que me estoy pasando de PHP estructurado a PHP POO y por ahora todo perfecto, el listado me funciona perfectamente, pero ha llegado el momento de crear el sistema de usuario y controlar los privilegios del usuario en el listado y la verdad es que no tengo mucha idea de como implementarlo.. echarme una mano por favor.

SALUDOS ALEX.

#!drvy

Hola,


Yo lo que suelo hacer, es guardar en una variable (array) toda la información del usuario, desde nombre, email, privilegios etc. etc... Toda esa información obviamente la puedes sacar de la base de datos.

Luego, cuando el usuario intenta ejecutar una acción, compruebo si tiene los privilegios necesarios mediante dicha variable.. y si no los tiene le tiro error.

Código (php) [Seleccionar]

class myMom {
  private $user = array('name'=>'papanoel','previlegios'=>array('borrar'=>false));
}


Saludos


jperezmonge

#2
Mira te digo yo como tengo echa la base de datos y como pretendo hacer la clase usuario.

Código (sql) [Seleccionar]
CREATE TABLE usuario(
user VARCHAR(255) PRIMARY KEY,
password VARCHAR(512) NOT NULL,
tipoPerfil VARCHAR(75) NOT NULL DEFAULT 'Anonimo',
tipoCentro VARCHAR(255) NOT NULL,
nombreSede VARCHAR(255) NOT NULL,
departamentoSede VARCHAR(255) NOT NULL DEFAULT '----------',
fechaMoficacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_sede_usuario FOREIGN KEY(tipoCentro, nombreSede, departamentoSede) REFERENCES sede(tipoCentro, nombreSede, departamentoSede) ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT fk_perfilUsuario_usuario FOREIGN KEY(tipoPerfil) REFERENCES perfilUsuario(tipoPerfil) ON UPDATE CASCADE ON DELETE RESTRICT
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;


Entonces supongo que tengo hacer en la clase usuario un método que sea comprobarPrivilegios y mirar el tipoPerfil(privilegios) y su respectivo controlador no?

Pero luego desde donde lanzo digamos al controlador, con la acción, y como paso la variable a la sesión, y demás.

Graphixx

Echale un ojo a :
http://scripts.ringsworld.com/user-authentication/vsignup-2.5/

es la nueva version de VAuthenticate, uno de los mejores sistemas de manejo de usuarios en php que he visto.
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

jperezmonge

#4
Le he echado un vistazo y tiene muy buena pinta lo que pasa que se pasan de mis requisitos y ademas necesito implementarlo en POO.

raul_samp

Cita de: jperezmonge en 17 Abril 2012, 13:53 PM
Pues resulta que me estoy pasando de PHP estructurado a PHP POO y por ahora todo perfecto, el listado me funciona perfectamente, pero ha llegado el momento de crear el sistema de usuario y controlar los privilegios del usuario en el listado y la verdad es que no tengo mucha idea de como implementarlo.. echarme una mano por favor.

SALUDOS ALEX.

Lo primero tienes que hacer un diseño de lo que tu sistema de usuarios va a contener.
Es decir tipos de usuarios, sus diferencias, privilegios y demás.
Una vez tengas claro eso una forma de hacerlo es crear una clase abstracta usuario que tenga toda la información que forma a un usuario (tipico: nombre, pass, privilegios y cosas asi).
Cada tipo de usuario (Ej: Administrador) hereda de esta clase e inicializa correctamente sus atributos.

La clase Usuario debe tener métodos para generar la sesión y encargarse de la persistencia en la BBDD (la verdad es que esto estaría mejor con un diseño MVC pero así da el pego)

Al principio de cada pagina (o de cada controlador si usas MVC) deberías comprobar si el usuario cumple los requisitos indicados para ver la página en cuestión. Eso si lo estas haciendo sin ningún framework lo podrías hacer incluyendo en cada pagina al principio el mismo modulo que cumple esta función.

Este módulo tendría que tener una función de este estilo.

En pseudo-código:

func redireccionaSiNoEs(tipoDeUsuarioNecesario):
    usuario = obtenerUsuarioEnSesion();
    si usuario == null:
        redireccionaALogin();
    si no:
        si usuario noEsInstanciaDe tipoDeUsuarioNecesario:
            redireccionaALogin();


Hay que tener en cuenta que la seguridad de esto no es muy buena que se diga. Pero la idea es la misma añadiendo más cosas (comprobar la correlación con la BBDD por ejemplo).

El aspecto que tienes que aprovechar es el polimorfismo, para ti todo tienen que ser Usuarios de una manera genérica a excepción de cuando los creas.

El problema que se plantea es la persistencia en la BBDD, no es común guardar un objeto así a capón serializado en una BBDD, (por lo menos no en esto), por eso deberías hacer una clase gestor de Usuarios que se encargue de con un nombre de usuario darte el objeto instanciado con los datos de la BBDD (ed: en la BBDD tiene que haber un campo tipo de usuario como supongo que tendrías).
Esa misma clase podría encargarse de dado un usuario guardarlo en la BBDD (así le quitamos responsabilidades a Usuario que se va pareciendo más a un modelo)

Bueno lo mismo me estoy extendiendo mucho, y no quiero que me hagas un tl;dr. Así que si con esto tienes más o menos una idea de como plantearlo, me alegro de haberte ayudado, si no, puedes preguntar más.

Un saludo!
Yeah Mr. White, yes science!!