Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
De usuarios y roles

Hola pataliebres,

Una vez más necesito de vuestros sabios consejos. En esta ocasión os quiero preguntar acerca de "usuarios y roles de usuario", que, es algo que me trae últimamente de cabeza, y, sobre lo que no tengo ninguna experiencia, y, con lo que no quisiera meter la pata.

A ver si soy capaz de explicarme. Si no lo consigo, y queréis, no dejéis de decirlo para y lo intentaré de nuevo o aclararé lo que haga falta. ¿De acuerdo? Pues, vamos allá.

Estoy trabajando en una aplicación que permite distintos tipos de usuario. Están los usuarios de la aplicación, propiamente, dicha, y, los usuarios que pueden administrar los datos con los que juega la aplicación, por decirlo así.

Estos últimos usuarios pueden ser de tres tipos, por ahora: administradores, editores y autores. Cada uno de estos tipos pueden hacer diferentes cosas, o, si se prefiere, cada uno de ellos no puede hacer según qué cosas.

Los administradores pueden crear usuarios y hacer todo lo que pueden hacer el resto de usuarios. Los editores pueden añadir datos en la aplicación, y editar sus datos y los de otros usuarios. Los autores, sencillamente, pueden añadir datos y editarlos, pero, sólo si los añadió él.

Bien. Lo que a mí me preocupa es lo siguiente. Hasta ahora, es en la interfaz de la aplicación donde se determina qué puede hacer un usuario y qué no. Si habláramos de Delphi, diríamos que la aplicación muestra este o aquél formulario a según qué usuarios.

De modo que si un usuario no tiene permisos para añadir otros usuarios, y trata de abrir el formulario para añadir nuevos usuarios... la aplicación, por decirlo así, no le muestra el formulario, y así, en un principio, podría pensarse que el usuario no consigue lo que quería.

Pero (no quisiera liarme mucho... os pido disculpas por el rollo), pero, digo, me queda la duda de si tengo que ir más allá y, además de no mostrar a un determinado usuario el formulario para añadir otros usuarios, si no tiene los permisos suficientes, me queda la duda de si además no debería mirar estos permisos cuando voy a añadir usuarios en la base de datos.

Esto es. El usuario no puede aquellos formularios que permiten tareas sobre las que no tiene privilegios, porque, la interfaz de la aplicación se lo impide, por decirlo así. Pero, cuando un usuario tiene los permisos suficientes, la interfaz le muestra el formulario oportuno, este hace "clic" en el botón correspondiente, y...

Hay un método de una clase que hace lo que sea menester: inserta un nuevo usuario, edita los datos de uno ya existente, etc. Ahora bien, la pregunta concreta podría ser, ¿debo también en este método averiguar si el usuario que lo está ejecutando tiene los permisos adecuados? ¿Basta con limitar al usuario la interfaz "que no puede ver"?

La verdad es que sobre estos temas estoy bastante pez. Yo supongo que me va a tocar añadir "la comprobación" en los "métodos" que llevan a cabo determinadas tareas, pero, no tanto por temor a los usuario, cuando a otras partes de la aplicación, y me explico, brevemente.

La aplicación que estoy desarrollando puede permitir "plugins" en un futuro. Ahora no cuenta con esta posibilidad, pero, es probable que sea así en un futuro. Ahora bien, algo como los "plugins" no trabajan "desde la interfaz" de la aplicación... y, por lo tanto, podrían ejecutar un determinado método, que insertara los datos de un nuevo usuario, por ejemplo, y, si no compruebo si se tienen permisos suficientes... lo insertaría sin problemas...

Ahora bien. ¿Podéis decirme algo sobre todo esto? ¿Tenéis alguna experiencia con aplicaciones de este tipo, que permitan diferentes usuarios, con diferentes permisos? A ver si me podéis echar una mano en base a vuestra experiencia o, en todo caso, con lo que queráis decirme al respecto.

Bueno. Muchas gracias a todos de antebrazo, digo antemano. Y disculpad el rollo, por favor.

PD. A mí se me hace raro que la "clase BD", por ejemplo, tenga que estar mirando a cada momento (en cada método, o buena parte de ellos), si el usuario que los ejecuta está autorizado o no... Pero seguro que me estoy perdiendo algo... estoy seguro...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 16-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola Dec
Se que poco podre ayudarte por que para empezar no se lo que son los "plugins", pero en el programa de la fabrica tengo varios tipos de permisos a los diferentes usuarios.
Esto lo hice (con vuestra ayuda) agregando un campo a la tabla usuarios (B1) de tipo numérico en la que según el numero del 1 al 5 tienen acceso a una parte del programa determinada, esto lo hago directamente cuando se loguean en el.
Si quieres te paso el programa completo con base de datos y todo así lo revisas, tal vez te sirva de algo, por lo menos te reirás un rato.
Saludos
Responder Con Cita
  #3  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias Caral. Bueno. Yo hago algo parecido en la aplicación que comento. En una tabla de la base de datos se guarda lo necesario para "asignar a cada usuario" un "nivel". Cuando un usuario se autentica en la aplicación se recoge el dato y desde ese momento el usuario tiene ya un nivel asignado, un rol, y, por tanto, unas "capacidades".

Pero, hasta el momento, únicamente estoy evitando que un usuario puede hacer esta o aquella cosa, desde la propia interfaz. Básicamente, lo que he comentado antes: un usuario trata de acceder al formulario de inserción de registros; se comprueban sus permisos; no tiene suficientes; se le redirige a otro lugar, no se le enseña el formulario en cuestión.

Pero, si el usuario tiene permisos... la intefaz "le deja pasar", y, cuando el usuario inserte un nuevo registro, pongamos por caso, se ejecuta un determinado método de una clase "BD". Es en esta clase donde ahora mismo no distingo entre usuarios... es decir, es como si dijera, "oyes, si has podido ejecutar este método, entonces asumo que tienes los permisos para ejecutarlo".

Y no sé si eso basta o si tendría que también ahí, en el propio método que inserta nuevos registros a la base de datos, si tendría, digo, que volver a comprobar si el usuario en cuestión tiene o no permisos suficientes. Lo de menos es hacerlo. O sea, que no es por no hacerlo, es que no estoy seguro de que se deban de enfocar así las cosas o qué.

Un "plugin" viene a ser una especie de añadido a la aplicación. Digamos que la aplicación no puede imprimir registros. Pero, permite "instalar plugins", de modo que algún plugin pueda imprimir, efectivamente, registros. Ahora bien, aquí está parte del asunto que me preocupa: el plugin no "pasa" por la interfaz.

El plugin se ejecuta "junto con la aplicación", no es un usuario, y, por tanto, no necesita pasar por un formulario en la interfaz para acceder a los registros, por ejemplo. Ahora bien, entonces, me pregunto ahora, ¿es el autor del supuesto plugin quien tiene que preocuparse de que un usuario tenga permisos suficientes para hacer esta o aquella cosa?

¿En todo caso, independientemente de lo que haga el plugin, en todo caso, digo, sería mejor que el método de la clase "BD" que añade registros a la base de datos, comprobara si el usuario que ejecuta el método tiene permisos o no los tiene? Pensando en ello comienzo a pensar de esta manera... creo que va a ser necesario que el propio método compruebe si el usuario dispone de permisos... además de la interfaz...

Y ya digo, que no es por no hacerlo así, sino que me quedan dudas...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 16-11-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Señor:

Extensa pregunta venida de un gurú.

Si estuviéramos hablando de Delphi, te daría un planteamiento de esos de andar por casa que suelo meter yo, ahora bien, como creo que no es ese el caso y la envergadura del asunto va mucho mas allá, así en voz bajita te diría que le eches un vistazo al código de Joomla, que como creo que sabes, todas operaciones las hace estupendamente.
Ahora bien, no creo que por hacer esto que te propongo, reste creatividad ni mérito a lo que te traes entre manos y nada más dec.

Así que ahora, también bien

Un saludo.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 16-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Bueno como hace rato de no doy una, pues una mas no cuenta.
A lo que entiendo un plugin es un programa aparte que permite conectarse con el programa (principal) y hacer ciertas cosas.
Bueno, normalmente lo que hacemos es conectarnos a la bd directamente desde el programa, es lo mas facil.
Hacer una comprobacion de cada paso por usuario me parece que seria lento y ademas mucho codigo.
Que tal hacer un programa aparte que sea este el que se conecte a la bd y que tanto el programa principal como el plugin tengan que pasar por el?,
(este seria el que comprobaría los permisos).
Ya se, la idea descabellada, no se puede esperar mucho del novato.
Saludos

Última edición por Caral fecha: 16-11-2007 a las 20:38:33.
Responder Con Cita
  #6  
Antiguo 16-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Dec,
Veamos al problema de debemos partir en dos....
Lógica por un lado, lo visual por el otro.

El problema se soluciona de diferentes maneras. Como tu comentas.... una es ocultar las cosas dependiendo de los permisos que tiene.
Esta es la más común y considero que es la más simple. Creería que con eso no tienes problemas.

La cuestión de la lógica: Como registrar estos permisos... Bueno, en esto todavía estoy como en formación pero estaba pensando en conseguir algo parecido a lo que se conoce como matriz de perfiles.

Dicha matriz cuenta por el lado de las columnas cada perfil, y por el lado de las filas las funcionalidades. Por cada combinación válida entre P (Perfil) y F (funcionalidad) se marca la celda con una X.
Veamos algo así:

Código:

---- P1 --- P2 --- P3 ---
F1 - X  ---    --- X  ---
F2 -        X  ---    ---
Cada X es un permiso.

Si es necesario, debería contarse con un alguna función que determine ciertas posibles incongruencias... algunas especies de reglas que dicte el negocio.

Porqué te digo esto de la matriz, porque es posible que las asignaciones entre los perfiles y las funciones cambien. Y una manera de comprobar las posibilidades de armado de esta matriz es teniendo un conjunto de reglas que chequen las posibles combinaciones.

Ahora viene lo lindo... ¿Como representar esto en una DB?
Lo natural: Una tabla Perfiles, otra tabla Funciones (tu verías que campos serían necesarios). Esto permite hacer que la matriz se amplie si es necesario. Permitiendo modificar, añadir tantas funciones como perfiles sean necesarias.

El problema de los perfiles a los que te ves sometido: esta subclasificación puede resolverse de forma sencilla: en realidad le asignamos un nombre ficticio a dicho subperfil y lo hacemos pasar como si fuera un perfil en la tabla. Por ejemplo que P12 sea un subperfil de P1. Como en tu caso: Editor es un subperfil de Admin, y Administrador de Admin (por darle un nombre).

El problema en tu caso sería que hay una pequeña complicación, entre los mismos perfiles hay algunas funciones que no las cumple del toda un determinado usuario (o al menos eso entendí yo). Es decir que no siempre un usuario de un perfil P dete tener habilitado todas las funciones F que le correspondan.

A esto yo lo estoy analizando... y por el momento considero que se soluciona teniendo esas reglas que yo te comentaba antes. La idea es que cuando se añada o se modifique algún perfil o función, se compruebe su validez en el conjunto de reglas.

Esto lo veo como objetos, Objetos Reglas, Perfiles, Funciones... . Su dificultad es llevarlo a la base de datos... y bueno, por esto te digo que estoy en "producción". Si me entiendes un poco puede que te la ingenies para encontrar una manera de registrar las reglas (es allí el lio que yo me hago).

No se si se me entiende la idea.

Con respecto a lo que dices si es necesario tener un método, evento... o lo que sea que se encargue de chequear que tipo de perfil posee cada vez que sea necesario.... debo decirte que yo lo considero erroneo.

Mi intuición me dice que: "Cuando se inicia la seción se tiene conocimiento del perfil, y de sus permisos". Por lo que una vez validado el usuario doy por ENTENDIDO que pertenece a uno u otro perfil. No es necesario estar comprobando con cada clic (por decirlo así) si es o no una persona válida.
Ahora, distinto sería si las tareas o funciones deben ser críticas. En estos casos si considero la opción de verificar su validez. Como ejemplo: que pida algún código de activación o validación de operación.
Como medida de seguridad adicional, (y si es necesario) pondría la posibilidad de que se cierre la cesión si se detecta X tiempo de inactividad. Pero esto ya es "chucherías"

No se si habré sido de ayuda...

Disculpa el rollo.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

ArdiIIa, lo cierto es que muchas ideas estoy cogiendo de WordPress, por ejemplo. Pero que muchas... sin ir más lejos esto de los "roles" de usuario, en buena medida viene de ahí, sin embargo, en esto me he apartado un poco... bastante. Y he mirado por encima el asunto de los "roles" de usuario en WordPress... y me asusta. De hecho, lo he contado hoy en mi weblog, estoy temiendo que se me caiga todo el teatro encima, porque,... se me ha hecho tan "sencillo" que no me lo creo... algo fallará tarde o temprano... casi estoy seguro... o, lo que es peor aún, no estoy seguro...

Y, Caral, lo que dices no es ninguna tontería. Algo así he pensado yo también, si bien ahora mismo no sería capaz de explicar el tema. Sin embargo, comprobar si un usuario puede insertar registros, por ejemplo... significa una línea de código... es algo así como esto:

Código PHP:
if($user->Can(ROLES_CAP_MANAGE_POSTS)){
  
// Puede hacerlo...

Ahora bien... aunque es una línea de código... hasta ahora la clase "BD" se ha mantenido "al margen" de estos asuntos. Por ejemplo, en el caso de la validación de datos, que es otro tema, pero, sirve al caso. La clase "BD" no valida datos. Da por supuesto que lo que le llega es válido. La clase "BD" únicamente "valida" lo suyo, es decir, se asegura de "escapar" ciertos caracteres que no deben entrar "tal cual" en la base de datos, pero, no se preocupa de si el nombre de un registro es válido, por ejemplo, sino que da por supuesto que lo que se le pasa lo es.

Pero,... ahora, con el tema de los usuarios... Vamos a suponer una cosa. Supongamos que la aplicación no tiene plugins ni los va a tener. ¿En este caso el asunto parece más claro, no? Quiero decir, el usuario no "llama métodos" de la clase "BD". Es la interfaz de la aplicación la que, por decirlo así, llama los métodos oportunos de la clase "BD".

En este caso, si un usuario no puede añadir registros, por ejemplo, no tendrá jamás acceso al formulario que los añade, y, por tanto, no podrá añadirlos, sin más. ¿Verdad que esto sí que parece más claro? A mí me lo parece, por lo menos... no sé si es tan claro como me parece a mí...

Pero, si "alguien" más puede llamar métodos de la clase "BD", como un plugin de la aplicación, por ejemplo, entonces ya es otra cosa... ¿Al menos los métodos "susceptibles" de ser llamados por un plugin deberían controlar si el usuario cuenta con los permisos suficientes? ¿O todos los métodos de la clase "BD" deben hacer esta comprobación?

Por otro lado, se me ocurre al hilo de lo que escribo, y siguiendo un poco lo que dices Caral, fíjate, ¿no podría contarse con un "módulo" aparte, que hiciera las veces de "interfaz" entre la clase "BD" y los plugins? De este modo, los plugins no podrían sino comunicarse con dicha interfaz, y, ahora sí, la interfaz comprobaría que el usuario de turno tiene los permisos suficientes para hacer esta o tal cosa... hum... tal vez por aquí pueden ir los tiros.

Otra cosa sería, claro está, impedir que un plugin hiciera uso de la clase "BD"... la aplicación hace uso de la clase "BD" en una determinada forma: esta clase se instancia en una variable "global", que, por tanto, estaría disponible para los plugins... así que... no sé yo si estamos en las mismas... aunque, quizá hemos avanzado algo, y, por otro lado, tal vez podría encontrarse la forma de averiguar si es un "plugin" quien ejecuta un determinado método de la clase "BD", aunque, a bote pronto, me parece complicado...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Todo ayuda Delphius. ¿Sabes qué pasa? Que al cabo he "conseguido" (todavía lo pongo en duda) un sistema de privilegios, de "roles", muy, pero, que, muy sencillo... vamos, a mí me lo parece, y, desde luego, comparándolo con el de WordPress (que es un sistema similar al que traigo entre manos, si bien el mío es mucho más humilde), digo, en WordPress es un asunto bastante complejo, o a mí me lo parece.

Sin embargo, voy a mostrar la "burrada" que he preparado para asignar diferentes permisos a diferentes usuarios. A continuación el método "InitializeUserRoles()" de una clase "Roles":

Código PHP:
  private function InitializeUserRoles(){
    
// 10 = Admin user
    
$this->userRoles[10][ROLES_CAP_MANAGE_SITE] = true;
    
$this->userRoles[10][ROLES_CAP_MANAGE_LINKS] = true;    
    
$this->userRoles[10][ROLES_CAP_MANAGE_TERMS] = true;  
    
$this->userRoles[10][ROLES_CAP_MANAGE_POSTS] = true;   
    
$this->userRoles[10][ROLES_CAP_MANAGE_USERS] = true;    
    
$this->userRoles[10][ROLES_CAP_MANAGE_THEMES] = true;
    
$this->userRoles[10][ROLES_CAP_MANAGE_IMPORT] = true;    
    
$this->userRoles[10][ROLES_CAP_MANAGE_EXPORT] = true;    
    
$this->userRoles[10][ROLES_CAP_MANAGE_OPTIONS] = true;
    
$this->userRoles[10][ROLES_CAP_MANAGE_PROFILE] = true;      
    
$this->userRoles[10][ROLES_CAP_MANAGE_COMMENTS] = true;
    
// 9 = Editor user
    
$this->userRoles[9][ROLES_CAP_MANAGE_SITE] = true;
    
$this->userRoles[9][ROLES_CAP_MANAGE_LINKS] = true;    
    
$this->userRoles[9][ROLES_CAP_MANAGE_TERMS] = true
    
$this->userRoles[9][ROLES_CAP_MANAGE_POSTS] = true;     
    
$this->userRoles[9][ROLES_CAP_MANAGE_PROFILE] = true;          
    
$this->userRoles[9][ROLES_CAP_MANAGE_COMMENTS] = true;
    
// 8 = Author user
    
$this->userRoles[8][ROLES_CAP_MANAGE_SITE] = true;    
    
$this->userRoles[8][ROLES_CAP_MANAGE_POSTS] = true;  
    
$this->userRoles[8][ROLES_CAP_MANAGE_PROFILE] = true;    
    return 
true;
  } 
Eso, que estoy seguro de que puede mejorarse (pero, ahora no estamos viendo eso), se resume en "El usuario con nivel 10 puede administrar el sitio", "El usuario con nivel 10 puede administrar enlaces", etc., etc. Luego, como puede verse, según bajamos el nivel del usuario este puede hacer menos cosas. Eso sería una especie de "tabla de capacidadades según el nivel de cada usuario".

Hay que decir que la clase "Roles" sirve a una propiedad de la clase "User". La clase "User" cuenta con una propiedad (variable, miembro) del tipo "Roles". Cuando se instancia la clase "User" se asigna a la variable "userlevel" (del tipo "Roles") un determinado nivel y, la propia clase "User" cuenta con un método "Can()" que lo que hace es llamar a este otro de la clase "Roles":

Código PHP:
  public function UserCan($capability){    
    if(isset(
$this->userRoles[$this->userLevel][$capability])){
      return 
$this->userRoles[$this->userLevel][$capability];  
    }else{
      return 
false
    }
  } 
Que, como puede verse, viene a comprobar si el usuario del nivel que sea, puede realizar una determinada tarea, tiene la capacidad de realizarla. Básicamente en eso se resume todo... (!). En la base de datos hay una tabla "users" y otra tabla "usersmeta", que están relacionadas. A cada usuario le corresponde un nivel, que se guarda en "usersmeta". Y eso es todo... No hay más... ¡y parece funcionar!

Pero,... francamente, no entiendo entonces a qué tanto "lío" en WordPress con los permisos... y, como sé perfectamente que WordPress es mucho WordPress, y que mi sistema no le llega a la altura de los zapatos... no tengo sino pensar que en algo estoy metiendo la pata, que lo que he hecho no está bien hecho, porque, ¡no puede haberme resultado tan sencillo, ni, en general, resultar tan sencillo como parece y es!

Pero, para terminar, aquí aplica aquello de "Eppurse muove"... porque, con todas las dudas que hay todavía por ahí rondando, el caso es que parece que el puñetero sistema funciona...

En todo caso, y, en lo que respecta a esto último, tal vez debería hacer lo que ha recomendado ArdiIIa, esto es, mirar algún otro programa similar y estudiar su funcionamiento. Y a lo mejor para lo que planteo desde un principio tampoco estaría mal que hiciera esto, pero, bueno, qué leches, quería comentar aquí el asunto a ver qué os parecía a vosotros.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 16-11-2007 a las 21:16:38.
Responder Con Cita
  #9  
Antiguo 16-11-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Bueno Dec, para empezar se que eres nuevo en este foro con apenas 8 mil y pico de post se te puede perdonar el que pongas estos ejemplos que me parece que son de PHP en el foro de varios, pero como dije, se que eres nuevo y solo te puedo remitir a que leas la GDE del club.
Aparte de la broma:
Me parece que tendrías un problema con lo que plateas (seguro ya lo as pensado).
Que pasa si en un momento determinado decides que el usuario con permisos 9 no puede accedes a X seccion?
Tendrias que ir al programa y modificarlo por codigo, para mi lo ideal seria que esto se guardara en la tabla, (me refiero a los accesos de cada nivel), de esa manera llamaria a:
Usuario.
Nivel.
Acceso permitido.
Osea en vez de dos parametros tres.
Se que te complico la vida, pero tambien aprendemos.
Disculpa la broma, no me pude contener.
Saludos
Responder Con Cita
  #10  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Si os aburrís podéis echar un vistazo, y, si encontráis algo que "hieda y no huela", os estaré agradecido si me lo comentáis, leches, ¡que para algo aparecéis en los créditos!

http://82.158.255.47/gbprealpha/

Y vamos a lo que vamos:

Usuario autor:

Login: clubdelphi1
Password: clubdelphi1

-------

Usuario editor:

Login: clubdelphi2
Password: clubdelphi2

-------

Usuario administrador:

Login: clubdelphi3
Password: clubdelphi3

Ya me diréis...

PD: NO TEMÁIS ROMPER NADA... NO HAY PELIGRO ALGUNO, COMO MUCHO, HABRÍA QUE RESTAURAR LA BASE DE DATOS, NADA MÁS, Y ESTO LO HAGO 200 VECES AL DÍA, INSISTO, NO HAY PROBLEMA, NO TEMÁIS ROMPER NADA EN ABSOLUTO, DARLE LA CAÑA QUE QUERÁIS AL BICHO.

PD2. Ya puestos a "saltarme" la guía de estilo, me he puesto a gritar.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 16-11-2007 a las 21:39:01.
Responder Con Cita
  #11  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Caral, de hecho podría ser... guardar los "permisos" en la base de datos... creo que WordPress hace algo muy parecido a eso, cuando no eso mismo. Tal vez podría mirarse, porque, efectivamente, resultara interesante que un "editor", en un momento dado, también pudiera administrar usuarios, sin que asumiera el rol de "administrador" sí o sí.

¡Ay! Ya sabía yo que esto no podía ser tan sencillo...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #12  
Antiguo 16-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Si ves que te funciona, por el momento puedes dejarlo así...
Entiendo lo que planteas, y si del modo en que lo indicas tal parece que no resulta ser demasiado complejo.
En todo caso, yo si lo he complicado

A tu modo, el modelo funciona bien. Y no veo que el método Can este mal. A una primera visión parece que se ajusta a lo que deseas.
No se si estás acostumbrado a UML, sino lo estás tal vez tener un pequeño panorama visual te haga ver algo que te está incomodando.

No conozco WordPress, y no creo que con mis escasos conocimientos en el área pueda entenderlo si le hecho una ojeada. Por ese lado no te sabría decir...

Te soy sincero, tengo que sentarme tranquilo a analizar bien en detalle esto de los permisos y roles. Si me das un tiempo puede que con un mejor análisis del problema encuentre otro razonamiento... pero para esto necesitaría conocer con mayores detalles tus clases, el problema, el dominio... y pues... esto puede que no venga al caso y no sea posible.

No te rompas demasiado la cabeza, si a tu parecer esto no amerita demasiada complejidad la simpleza de tu código es útil.


Se que no aporté demasiado... como te dije: tendría que estar en tu situación y analizar con mayores detalles para saber si el código generado necesita limpieza o no.

Si crees que te podamos ser de ayuda, y si lo ves oportuno y conveniente que tengamos acceso a una descripción más global del problema que te molesta pues aqui me tienes a mi. Aunque como sabes... yo de PHP apenas lo conozco pero en lo que es un análisis y diseño puede que te sea de ayuda.

Exitos...
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No te preocupes en absoluto Delphius. De veras, tampoco es mi intención que nadie se coma la cabeza por algo, que, en todo caso, me toca a mí.

En serio. No era mi intención. Lo que cada uno pueda aportar bien aportado está y se agradece, pero, no es menester volverse loco por contestar a este loco.

Por otro lado, y, si todo va como espero (¡pero nunca nada va como espero!) pronto podrás echar un vistazo al código fuente del invento.

Así que ya sabes Delphius, no te preocupes más de la cuenta.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #14  
Antiguo 16-11-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por dec Ver Mensaje
Ya me diréis...

PD: NO TEMÁIS ROMPER NADA... NO HAY PELIGRO ALGUNO, COMO MUCHO, HABRÍA QUE RESTAURAR LA BASE DE DATOS, NADA MÁS, Y ESTO LO HAGO 200 VECES AL DÍA, INSISTO, NO HAY PROBLEMA, NO TEMÁIS ROMPER NADA EN ABSOLUTO, DARLE LA CAÑA QUE QUERÁIS AL BICHO.
Me da un error

Cita:
509 Bandwidth Limit Exceeded
The server is temporarily unable to service your request due to the site owner reaching his/her bandwidth limit. Please try again later.


Me gusta.... Un excelente trabajo en sus comienzos. Ya puse mi primer artículo..
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #15  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No creáis a ArdiIIa, ¡no le da ese error! Otro tal vez, ¡pero ese no!

PD. Gracias.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #16  
Antiguo 16-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por dec Ver Mensaje
Hola,

No te preocupes en absoluto Delphius. De veras, tampoco es mi intención que nadie se coma la cabeza por algo, que, en todo caso, me toca a mí.

En serio. No era mi intención. Lo que cada uno pueda aportar bien aportado está y se agradece, pero, no es menester volverse loco por contestar a este loco.

Por otro lado, y, si todo va como espero (¡pero nunca nada va como espero!) pronto podrás echar un vistazo al código fuente del invento.

Así que ya sabes Delphius, no te preocupes más de la cuenta.
Entre locos nos entedemos
No me preocupo, pero considero que este no sólo es útil para ti, sino también para mi... porque en parte es algo que también estoy analizando desde hace tiempo y puede que ayudandote a ti, en lo que mis pocas neuronas puedan, logre comprender que es lo que falla en mi contexto.

Cita:
Empezado por dec Ver Mensaje
Tal vez podría mirarse, porque, efectivamente, resultara interesante que un "editor", en un momento dado, también pudiera administrar usuarios, sin que asumiera el rol de "administrador" sí o sí.

¡Ay! Ya sabía yo que esto no podía ser tan sencillo...
Pues a eso mismo me refería con el uso de las reglas.
Considero que esto necesita de una pespectiva. Mirar al problema desde el dominio del negocio.
Velo así: ¿El contexto del problema indica, o da indicios, que los perfiles sean modificados a lo largo del tiempo?
¿En el contexto del problema, tiene significado que un editor administre a un usuario?

En un ambiente en donde las cosas fluctúan demasiado, y deben ser controladas se necesita de una mirada un tanto distinta: ser flexible. Por lo general... para dar cierta flexibilidad a un enfoque rígido (Por ejemplo: un usuario es administrador y siempre lo será, y hará X,Y,Z) es necesario implementar reglas de negocio que alteren o adapten a estos potenciales requisitos.

¿Como se soluciona esto?
Dezplando la responsabilidad de asignación de los permisos (combinación de funcionalidad y perfil. Véase la matriz) a una clase llamemosle Negocio. Un Negocio implementa ciertas políticas que por lo general, son cambiantes. A estas políticas las podemos formular en forma de reglas.

En forma práctica, la clase Negocio tiene como responsabilidad:
Crear Reglas
Editar Reglas
Eliminar Reglas

La clase regla lo que hace es tener registrado de alguna forma que se está permitido o no. Aquí, haría falta un análisis de como y que se necesita guardar para responder a frases como esta:

Regla de Negocio 1: Todo editor tiene la posibidad de dar de baja un texto.

¿Cómo registrar esto? Por esto digo, hace falta un análisis. Su problema es como traducir una frase gramatical a un conjunto ordenado de datos. En ocasiones basta con tener un campo que represente al sujeto (en este caso el editor), un campo que indica la condición (llamemosle permitido), un campo que reprenta al verbo o acción (baja) y un campo que represente al elemento (texto) . Algo así:

Código:
Tabla Reglas:
IDRegla - Sujeto - Permitido - Accion - Elemento
1       - Editor - NO        - Baja   - texto
Este modelo lo que hace es extender al simple modelo de las matriz. La matriz es un modelo rígido, y cuando se necesita alterar algo en lo particular este enfoque no sirve. La solución es implementar esta clase Regla que se comunica con las clases funciones y la clase perfiles para darle a conocer que le son permitidos o no.

¿Se entiende la idea?

Por esto te digo, que si no estás acostumbrado a UML, puede que esta sea la oportunidad...

Haste preguntas al nivel general y determina que posibles conjuntos de reglas son válidas en el contexto para determinar como enfocar al problema del mejor modo.

Disculpa por si no soy demasiado práctico... no tengo un ejemplo con el cual mostrarte. Todo lo tengo en la cabeza.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 16-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias otra vez Delphius. Hombre, yo reconozco que ahora mismo me pierdo en lo que dices, pero, le encuentro sentido, una cosa no quita la otra. Me pregunto si realmente, como dices, en el sistema es "común" alterar los permisos de los usuarios, y yo diría que, en este caso, no lo es.

Lo que el sistema contempla es que los usuarios puedan cambiar de "rol". Un usuario puede ser "autor" y, si un usuario "administrador" lo decide, puede pasar a ser "editor", o incluso "administrador". Pero, digamos que las "capacidades" de los usuarios están bastante definidas, a no ser que se contemplen excepciones.

Es decir, un usuario "autor", en principio, no puede manejar usuarios. Así que, a no ser que se contemple la excepción de que un usuario "autor" pueda manejar usuarios... Pero, francamente, creo que en este caso eso no sería necesario. Claro está que podría ser interesante.

O sea, que lo mismo estoy hablando desde un punto de vista "cansado" y que evita complicarse más en el asunto, porque, quién me dice a mí que no sería una buena cosa que un determinado usuario "autor" (no todos) pudiera hacer cosas de un usuario "administrador", por el motivo que sea.

Suena hasta bien. Suena como lo más "elegante", como lo más "logrado". Mientras que lo otro, o sea, los permisos "rígidos", suenan a la solución más sencilla, más facilona si se quiere ver así. Aunque, ya digo, francamente, pienso que en el caso del sistema que nos ocupa, si un usuario "autor" debe hacer cosas de administrador... tal vez lo suyo sería "promoverle" a usuario "administrador".

De hecho, mirando en WordPress (referencia obligada del sistema de que tratamos), no veo que puedan cambiarse los privilegios por separado, sino que, como en mi sistema (mi tesooooro), sólamente puede asignarse a un usuario un determinado "rol", que a su vez conlleva una serie de permisos rígidamente establecidos, si no me equivoco.

Me apena encontrarme en el estado de ánimo en que estoy, porque, he mirado el código de WordPress para muchas cosas, y, sin embargo, con este tema de los "roles", es como si me empeñara en mantener lo que tengo hecho... en no ir más allá... ni siquiera en averiguar cómo es que en WordPress el asunto "parece" tan "complicado", qué se esconde ahí para que sea así...

Tal vez lo haga. Y hasta tal vez no me quede más remedio que hacerlo.

Gracias otra vez Delphius, y gracias adelantadas a todo aquél que se una a este hilo de alguna forma.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #18  
Antiguo 16-11-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Bueno Dec, sin ánimo de meter la pata, te comento cómo lo haría yo.

Teniendo en cuenta que no vas por mal camino, es decir, que un usuario con un perfil de un tipo, si se requiere que haga otro tipo de acciones, se le promociona o cambia por parte de un administrador y santas pascuas.

Mi punto de vista es parecido al tuyo, pero añadiría algo más.
Por lo que he leido, asignas a cada usuario un rol, y dependiendo del que tenga, por aplicación permites o restringes el acceso a las partallas/opciones correspondientes.
Me parece buena idea, pero no suficiente.
Yo añadiría tantos roles como tienes en la BBDD, asignando a cada usuario los accesos extrictamente necesarios en la bbdd.
Es decir, en la tabla de la bbdd USUARIOS, un campo será el perfil, y también los valores para rellenar esas matrices que nos has mostrado. Asociado a estos perfiles, tendrías que tener en la bbdd tantos roles como perfiles. Cuando se asigna un perfil a un usuario, se le asigna el rol correspondiente. De esta manera, si alguine se 'cuela', sólo podría acceder a aquello que tú le permites.
Metiendonos en harina:
Roles Administrador, Editor y Autor, acceso de lectura a todas las tablas. Entiendo que pueden leer todos todo.
Rol Administrador: Acceso total a todas las tablas.
Rol Editor: Acceso total a las tablas SITE, MANAGE_LINKS, TERMS, POSTS, PROFILE, COMMENTS] : Leer, borrar editar registros
Rol Autor: Idem que Editor con sus particularidades; SITE, POSTS, PROFILE

Si los datos no se almacenan en tablas, sino en directorios, lo mismo con los usuarios definidos y sus accesos correspondientes a los directorios.

Ahora debes poner en la balanza el coste beneficio de la gestión de todo esto. Puede que sea un poco engorroso al principio.

Espero que te sirva de ayuda.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #19  
Antiguo 17-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias fjcg02. Claro que sí, tengo en cuenta todo lo que decís.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #20  
Antiguo 18-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Maestro amigo Dec.
Me he bajado WordPress (una versión que dicen que es en castellano), le voy a dar una miradita... a ver si comprendo mejor el asunto. Aunque como dije... no se muy mucho de PHP... en fin... tengo que ver.

Ya me decía entonces yo que lo mio ha sido para complicar las cosas, no me hagas caso.

Asi como dices, suena lógico lo de elevarle los privilegios. Mi modelo es un tanto diferente, está sujeto a posibles cambios en todo momento (como pa' complicarmelas viste)

Si logro aportarte en algo, bienvenido sea...
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Usuarios y roles morta71 Firebird e Interbase 10 05-02-2008 09:36:58
Permisos, roles y usuarios TJose Firebird e Interbase 0 04-04-2005 16:22:19
Recuperar roles y lista de usuarios de la DB alehillebrand Firebird e Interbase 3 19-02-2005 19:14:21
roles, sesiones y usuarios de oracle 7.3 y delphi 7 rcrmilo Oracle 12 03-06-2004 19:22:23
Roles - Usuarios y privilegios Osorio Firebird e Interbase 2 13-02-2004 23:34:31


La franja horaria es GMT +2. Ahora son las 06:50:15.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi