Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-07-2006
Ulises Ulises is offline
Miembro
 
Registrado: may 2003
Ubicación: Santiago de Chile
Posts: 82
Poder: 22
Ulises Va por buen camino
Permisos usando phplib

Hola a todos,

Tengo un problema con los permisos utilizando phplib y mysql, mas que nada es un problema de como hacerlo, necesito que usuarios tengan acceso en forma horizontal, vale decir :

Usuario1, permiso 1
Usuario2, Permiso 2
Usuario3, Admin

El usuario 1 solo debe ver datos para su nivel de permiso
El usuario 2 solo debe ver datos para su nivel de permiso
El usuario 3 ve los datos de los dos usuarios.

Cuando declaro los niveles de acceso en local.inc me funciona pero en forma vertical, es decir:

El usuario 1 ve solo sus datos
El usuario 2 ve sus datos y los del uno
El usuario 3 ve todos sus datos...

Alguien me puede ayudar...?

Ulises
Responder Con Cita
  #2  
Antiguo 27-07-2006
Avatar de Emilio
*Emilio* Emilio is offline
Capo
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 2.635
Poder: 10
Emilio Va por buen camino
No entiendo bien el planteamiento de tu pregunta, no obstante voy a aventurarme en dar una respuesta sin terminar de entender bien la pregunta.

Generalmente el sistema de niveles funciona de la siguiente forma...

Programas

Clientes --> Nivel 100
Proveedores --> Nivel 300
Facturas--> Nivel 500

Usuarios
Gerente --> Nivel 1000
Contable--> Nivel 500
Ayudante--> Nivel 300
Operario --> Nivel 100

Por tanto el Gerente tiene acceso a todo, el Ayudante sólo a proveedores y Clientes pero no a facturas y así hasta que la imaginación se te acabe.
__________________
Saludos
Emilio
Responder Con Cita
  #3  
Antiguo 27-07-2006
Ulises Ulises is offline
Miembro
 
Registrado: may 2003
Ubicación: Santiago de Chile
Posts: 82
Poder: 22
Ulises Va por buen camino
Exacto, es correcto...

Lo que yo me refiero es que a un mismo nivel de usuarios ellos vean sus propios datos, es decir:

Extraigo datos de diferentes paises, entonces quiero que cada pais vea sus propios datos, pero si coloco accesos de un mismo nivel todos se ven entre si, si coloco accesos ascendentes, pasa que el mas bajo se ve a si mismo, el subsiguiente se ve a si mismo y al anterior... me explico bien?, por eso me refiero a accesos horizontales...

Gracias por responder...

Ulises
Responder Con Cita
  #4  
Antiguo 28-07-2006
Avatar de Emilio
*Emilio* Emilio is offline
Capo
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 2.635
Poder: 10
Emilio Va por buen camino
¿Y con una condición no te vale?

Código PHP:
if ( ( $nivel >=300 ) and ( $pais == 'España' ) ) {
   
// Acceso permitido
}
else {
   
// Acceso denegado

__________________
Saludos
Emilio
Responder Con Cita
  #5  
Antiguo 28-07-2006
Ulises Ulises is offline
Miembro
 
Registrado: may 2003
Ubicación: Santiago de Chile
Posts: 82
Poder: 22
Ulises Va por buen camino
Gracias Emilio por tus respuestas...

He estudiado mas a fondo el tema y phplib considera estos permisos de la siguiente manera:

Phplib tiene una clase llamada perms, el cual considera un arreglo de la siguiente manera:

"user" => 1,
"author" => 2,
"editor" => 5,
"Supervisor" => 9,


cuando los numeros son pares se consideran permisos atomicos, es decir si se piden 4 y 6, el usuario debe tener ambos permisos.

el otro esquema son los permisos inclusivos que se usan al tener numeros impares, donde un usuario con un privilegio 7 automaticamente tambien tendria los privilegios 5,3 y 1.

Ahi segun me contaron la cosa se pone mas complicada, en fin vere de que otra manera puedo hacerlo, es una lastima pues phplib es una muy buena library para todo lo que son sesiones, permisos, paginas protegias, etc...

Gracias por tus respuestas...

Ulises
Responder Con Cita
  #6  
Antiguo 28-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
El problema es que estas definiendo mal los permisos, el sistema de phplib es muy sencillo , pero trabaja con bits y eso es lo que no has entendido bien.
De todas formas solo te valdra si no hay mas de 31 niveles de permisos ya que es lo maximo que admite phplib.
En el caso de que esa limitacion no sea un problema puedes usarlos perfectamente.
Para entender los de los permisos es mejor trabajar en binario donde se aclara todo perfectamente. Los permisos se guardan en un array de bits de 32 elementos, que caben en un numero entero, cada elemento puede estar activo o no.
Luego trabajando en binario podriamos definir los siguientes permisos:

Código:
00000000000000000000000000000001     ; Permiso para usuario1  
00000000000000000000000000000010     ; Permiso para usuario2
00000000000000000000000000000101     ; Permiso para usuario3
00000000000000000000000000000111     ; Permiso para el administrador
El usuario1 en su mascara de permisos tiene un solo Bit activado correspondiente a sus permisos.
El Usuario 2 tienen tambien su bit de permiso activado que es un bit distinto del usuario1, y a cero el resto de los bits.
En cambio al Usuario 3 ademas de haberle activado activado su propio bit de permisos (el tercero contando por la derecha), le hemos puesto a uno tambien el primer bit de la mascara, que se corresponde al permiso de usuario1, como consecuencia de esto el usuario3 tendra permiso para ver sus datos y ademas los datos de Usuario1 (por estar el bit correspondiente de usuario1 activado). Esto ultimo es a lo que le llaman permisos inclusivos.

Al usuario administrador como queremos que tenga todos los permisos posibles, en lugar de activarle un solo bit en su mascara de permisos , le hemos activados todos los bits correspondientes al resto de los usuarios.
En definitiva Administrador tiene activo (puesto a 1) los permisos de usuario1, usuario2 y usuario3, por lo tanto podra acceder a los datos de estos. En realidad siendo el administrador le podriamos activar todos los bits
de la mascara incluso los que no se estan usando en este momento:

Código:
11111111111111111111111111111111
Con esto, si en el futuro añadimos mas permisos o mas usuarios, el usuario Administrador ya tendra permiso automaticamente y no tendremos que ir activandole los bits que pudiesemos decidir utilizar en el futuro.

Hasta ahora hemos trabajado en binario, la cuestion es que php no pemite indicar estos numeros en su forma binaria de unos y ceros, lo que hace que
sea necesario indicar estos datos en decimal o en hexadecimal. Por lo tanto para indicar los permisos en el codigo php, hay que convertir estos numeros
a formato decimal, Luego la conversion de binario a decimal nos
da los siguientes numeros:

Código:
00000000000000000000000000000001  = 1  ; Permiso para usuario1  
00000000000000000000000000000010  = 2  ; Permiso para usuario2
00000000000000000000000000000101  = 5  ; Permiso para usuario3
00000000000000000000000000000111  = 7  ;  Permiso para el administrador
En definitiva debemos indicar los numeros 1 , 2 5 y 7 en el codigo php.

En cuanto a la deduccion de que cuando los numeros son pares se consideran permisos atomicos no es correcto, efectivamente cualquier permiso atomico (con un solo bit activado) es par, pero no es cierto lo contrario, que el numero sea par no significa que el permiso sea atomico.
Por ejemplo el numero 6, es par pero no especifica un permiso atomico, ya que el numero 6 en binario tiene activados 2 bits

Código:
00000000000000000000000000000110  = 6
Luego en nuestro caso si definimos el permiso 6, quien tenga ese permiso tiene acceso a los datos de usuario2 y usuario3.

El problema en definitiva que tenias es que estabas definiendo los numeros de permisos de forma incorrecta, por lo que describes debiste utilizar numeros parecidos a los siguientes:

Código:
Usuario1 =>  1= 00000000000000000000000000000001
Usuario2 =>  3= 00000000000000000000000000000011
Usuario3 =>  4= 00000000000000000000000000000100
De este modo usuario2 ve los datos de usuario1 y usuario3 solo ve los suyos.

Para lo que quieres tendrias que usar los siguientes numeros

Código:
Usuario1 =>  1= 00000000000000000000000000000001
Usuario2 =>  2= 00000000000000000000000000000010
Admin    =>  3= 00000000000000000000000000000011
Para las conversiones de binario a decimal una tabla como esta nos simplifica las cosas:

Código:
00000000000000000000000000000001 = 1
00000000000000000000000000000010 = 2
00000000000000000000000000000100 = 4
00000000000000000000000000001000 = 8
00000000000000000000000000010000 = 16
00000000000000000000000000100000 = 32
00000000000000000000000001000000 = 64
00000000000000000000000010000000 = 128
00000000000000000000000100000000 = 256
00000000000000000000001000000000 = 512
00000000000000000000010000000000 = 1024
...
Me he cansado de escribir la tablita de las narices pero es obvio como continua solo hay que ir multiplicando por 2 el numero anterior.

Si queremos asignar un un conjunto de permisos de varios bits solo hay que sumar los numeros de la tabla y ese es el numero decimal resultante a usar por ejemplo:

00000000000000000000000000001001 = 8 + 1 = 9

Espero que con todo este rollo puedas utilizar los permisos de phplib.

Saludos
Responder Con Cita
  #7  
Antiguo 28-07-2006
Avatar de Emilio
*Emilio* Emilio is offline
Capo
 
Registrado: may 2003
Ubicación: Palma de Mallorca
Posts: 2.635
Poder: 10
Emilio Va por buen camino
No sabía yo que phplib tuviese un sistema de permisos basado en binario, cosa que me resulta agradable porque hace ya mucho tiempo que hice uso de esa técnica y realmente me ofreció muy buen resultado.

Cita:
Empezado por Mick
Espero que con todo este rollo puedas utilizar los permisos de phplib.
Mike, tal vez al extenso e interesante ejemplo que has puesto le falta un detalle que si me permites añado la forma en que yo hacía uso de ello.

Código PHP:
$nivel =  8// Binario -->    1000 (     8) Tiene permiso al 8
$nivel =  9// Binario -->    1001 (   8+1) Tiene permiso al 8
$nivel 67// Binario --> 1000011 (64+2+1) No tiene permiso al 8

if ( ( $nivel ) ==) {
   echo 
"Permiso al 8";
}
else {
   echo 
"Denegado al 8";

Se trata de hacer comparación con el operador AND (&) sobre si mismo, una forma de hacer uso del ejemplo de Mick, tal vez phplib tenga también algo para eso y yo lo desconozca (no uso phplib) pero esa funciona.

PD: Esto incluso me trae viejos recuerdos, que me apañaba de la misma forma para activar reles por el puerto serie con mi viejo Clipper
__________________
Saludos
Emilio
Responder Con Cita
  #8  
Antiguo 31-07-2006
Ulises Ulises is offline
Miembro
 
Registrado: may 2003
Ubicación: Santiago de Chile
Posts: 82
Poder: 22
Ulises Va por buen camino
Hola,

En realidad esta muy bueno el ejemplo que pusiste, cuando quise decir que tendra que ver como asignar los permisos me referia que la cantidad de usuarios que dispongo es bastante elevada entonces la clase de phplib puede que no me cubra todo, pero lo intentare nuevamente.

Gracias por la explicacion en binario nuevamente, esta estupenda...

Ulises
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
Permisos NTFS johncook API de Windows 0 24-07-2006 17:05:33
Permisos de IBConsole Novata2006 Firebird e Interbase 0 12-05-2006 13:26:06
Permisos en Interbase federiconqn21 Conexión con bases de datos 1 06-02-2006 16:15:20
Control de Permisos con ADO Migpal MS SQL Server 4 08-11-2005 08:27:50
permisos de red nicocer API de Windows 2 18-06-2004 20:17:46


La franja horaria es GMT +2. Ahora son las 20:11:16.


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