Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Jeronimo en Diciembre 04, 2014, 08:43:38 pm
-
¡Hola!
Necesito crear un sistema de permisos para usuarios de mi software. Tengo muy poco ideado y necesito su ayuda.
En principio, crearía grupos (o categorías) de usuarios. Cada grupo tendría determinados permisos. Luego, cada usuario pertenecería a uno o más grupos, con lo cual podría tener los permisos de todos los grupos de usuarios que integre.
Esa idea me gusta, pero no sé cómo implementar algunas cosas.
Los permisos pueden ser tanto para acceder a módulos del sistema como para realizar determinadas funciones dentro de cada módulo. Por ejemplo: el usuario X no tiene permiso para acceder al módulo de caja y el usuario Y tiene permiso para acceder al módulo de caja, pero no para hacer descuentos.
¿Cómo me aconsejan que cree el árbol (la estructura) de permisos?
Hace mucho tiempo hice algo así: a cada módulo o función le asigné un número (id). Entonces, a cada usuario le asignaba los id de los permisos que se le otorgaban. Y cuando el usuario quería realizar determinada función, antes de ejecutarla el sistema buscaba en la base de datos el permiso necesario. Si lo encontraba, seguía la ejecución de la función; si no, le daba un mensaje explicativo y no se ejecutaba.
Me parece muy poco ortodoxo hacerlo de esa manera, aunque no sé muy bien por qué.
¿Qué me conviene hacer?
Muchas gracias.
Jerónimo
-
Hola yo estoy usando algo por el estilo te muestro que es lo que hago en partes
primer declaro unas contantes de este tipo
Public Const PERMIT_ALL As Long = -1
Public Const PERMIT_AUDIO1 As Long = &H1
Public Const PERMIT_AUDIO2 As Long = &H2
Public Const PERMIT_DB As Long = &H4
Public Const PERMIT_LIVE As Long = &H8
Public Const PERMIT_HTH As Long = &H10
Public Const PERMIT_PROG As Long = &H20
Public Const PERMIT_CONF As Long = &H40
Public Const PERMIT_DRAGANDDROP As Long = &H80
bien vos cambiarle los nombres (el primero es para todos los permisos), fijate que tienen valores multiplos (o algo asi no se como se dice, alguien que me corrija).
ahora en tu base de datos tenes que poner un campo con un valor Numérico en los tabla de los usuario (yo en mi caso lo llame Privileges)
en el formulario que tengo los privilegios tengo algo como esto para guardar los datos
Dim p as long
If CheckAudio1.value = vbChecked Then p = p Or PERMIT_AUDIO1
If CheckAudio2.value = vbChecked Then p = p Or PERMIT_AUDIO2
If CheckBD.value = vbChecked Then p = p Or PERMIT_DB
If CheckLive.value = vbChecked Then p = p Or PERMIT_LIVE
If CheckHTH.value = vbChecked Then p = p Or PERMIT_HTH
If CheckProg.value = vbChecked Then p = p Or PERMIT_PROG
If CheckConf.value = vbChecked Then p = p Or PERMIT_CONF
If CheckDD.value = vbChecked Then p = p Or PERMIT_DRAGANDDROP
rs("Privileges") = p
rs.Update
rs.close
para recuperarlos:
Dim p as long
p = rs("Privileges")
CheckAudio1.value = IIf((p And PERMIT_AUDIO1) = PERMIT_AUDIO1, vbChecked, vbUnchecked)
CheckAudio2.value = IIf((p And PERMIT_AUDIO2) = PERMIT_AUDIO2, vbChecked, vbUnchecked)
CheckBD.value = IIf((p And PERMIT_DB) = PERMIT_DB, vbChecked, vbUnchecked)
CheckLive.value = IIf((p And PERMIT_LIVE) = PERMIT_LIVE, vbChecked, vbUnchecked)
CheckHTH.value = IIf((p And PERMIT_HTH) = PERMIT_HTH, vbChecked, vbUnchecked)
CheckProg.value = IIf((p And PERMIT_PROG) = PERMIT_PROG, vbChecked, vbUnchecked)
CheckConf.value = IIf((p And PERMIT_CONF) = PERMIT_CONF, vbChecked, vbUnchecked)
CheckProg.value = IIf((p And PERMIT_PROG) = PERMIT_PROG, vbChecked, vbUnchecked)
CheckDD.value = IIf((p And PERMIT_DRAGANDDROP) = PERMIT_DRAGANDDROP, vbChecked, vbUnchecked)
entonces si en la variable p almacenamos los privilegios del usuario cuando quieras saber si tiene un cierto privilegio lo haces asi
if (p And PERMIT_CONF) = PERMIT_CONF then
msgbox "puede entrar en la configuracion"
end if
Saludos.
-
Ademas te podría interesar implementar el concepto de Roles. Es el ROL el que tiene determinado los accesos (Vendedor, Almacenero, Facturación, Cajero, Dios, etc, etc) y luego asignas el rol al usuario.
Saludos
-
¡Muchas gracias por sus respuestas!
Leandro: no entiendo bien eso de "p = p OR PERMIT_CONF" y "(p And PERMIT_AUDIO1) = PERMIT_AUDIO1", pero lo voy a investigar. Me gusta esta forma de asignar permisos en un campo con un solo número. Supongo que en esas dos citas que marco y en la relación entre los números de los permisos (también lo voy a investigar) radica el poder de hacerlo así y que no haya confusión a la hora de calcular o recuperar los permisos.
Yván: eso mismo quiero hacer. Yo hablé de grupos de usuarios pero quise significar lo mismo que sugerís, si es que entendí bien, con otra ventaja. Ejemplo: creo un grupo (rol) Administrador con permisos totales, otro Vendedor con determinados permisos, otro Cajero con sus permisos correspondientes. Y luego al usuario X lo asigno al grupo Administrador, es decir, tendrá todos los permisos. Al usuario Y lo asigno a los grupos Vendedor y Cajero y tendrá los permisos de ambos grupos. Y al usuario Z lo asigno solo al grupo Vendedor, con lo cual tendrá solo los permisos de ese grupo.
Ahora, tendría que ver cómo ensamblar esto con el esquema sugerido por Leandro.
¿Cómo la ven?
Muchas gracias.
Jerónimo
-
Hola Jerónimo no sabría bien como explicarlo y de intentarlo haría toda una confucion, asi que te doy un ejemplo básico y podes jugar con eso y entenderlo.
Option Explicit
Private Const PUEDE_CAMINAR As Long = &H1
Private Const PUEDE_HABLAR As Long = &H2
Private Const PUEDE_ESCUCHAR As Long = &H4
Private Sub Form_Load()
Dim P As Long
P = PUEDE_CAMINAR Or PUEDE_HABLAR
MsgBox "PUEDE CAMINAR? = " & ((P And PUEDE_CAMINAR) = PUEDE_CAMINAR)
MsgBox "PUEDE HABLAR? = " & ((P And PUEDE_HABLAR) = PUEDE_HABLAR)
MsgBox "PUEDE ESCUCHAR? = " & ((P And PUEDE_ESCUCHAR) = PUEDE_ESCUCHAR)
P = PUEDE_CAMINAR Or PUEDE_ESCUCHAR
MsgBox "PUEDE CAMINAR? = " & ((P And PUEDE_CAMINAR) = PUEDE_CAMINAR)
MsgBox "PUEDE HABLAR? = " & ((P And PUEDE_HABLAR) = PUEDE_HABLAR)
MsgBox "PUEDE ESCUCHAR? = " & ((P And PUEDE_ESCUCHAR) = PUEDE_ESCUCHAR)
End Sub
-
Aca te dejo un ejemplo amigo
(http://snag.gy/D19nv.jpg)
(http://snag.gy/nNORW.jpg)
https://mega.co.nz/#!dNcgiQRZ!EnRHWcQK7OD969ySd7SW_VdoAE1U-t5hGpXHe7AoKFA (https://mega.co.nz/#!dNcgiQRZ!EnRHWcQK7OD969ySd7SW_VdoAE1U-t5hGpXHe7AoKFA)
Lo que hace es desabilitar los menus o botones segun lo que esta en la base datos, ahi lo que va a faltar es que crees un formulario abrir segun el usuario y le pones en donde puede tener acceso y no
-
¡Genial! Ya lo pruebo.
Muchas gracias a todos por su tiempo. Son de gran ayuda para mí.
Saludos.
Jerónimo
-
Leandro: una consulta.
Supongamos que yo tenga 200 permisos en mi sistema. El último tendría un número realmente grande (porque cada uno es el doble del anterior). ¿No habría problema con eso?
Otra: al ser tantos permisos, ¿no puede pasar que con este sistema surja algún error? Me da miedo que al ser tantos permisos y que todo resulte en un único número para asignar a un usuario, se produzca algún error.
Te pregunto esto porque hasta ahora no he podido encontrar la explicación de esta metodología para poder entenderla.
Muchas gracias.
Jerónimo
-
200 permisos :o, no pense que tantos, pero bueno de esta forma tenes un maximo de 32 (si no me equivoco). ahora, como todo tipo de permiso tiene un sub permiso entonces podes hacer otro campo para ese ese subpermiso el cual cuenta con 32 opciones mas y asi susecivamente
estas serian las 32 constantes
Private Const As Long = &H1
Private Const As Long = &H2
Private Const As Long = &H4
Private Const As Long = &H8
Private Const As Long = &H10
Private Const As Long = &H20
Private Const As Long = &H40
Private Const As Long = &H80
Private Const As Long = &H100
Private Const As Long = &H200
Private Const As Long = &H400
Private Const As Long = &H800
Private Const As Long = &H1000
Private Const As Long = &H2000
Private Const As Long = &H4000
Private Const As Long = &H8000
Private Const As Long = &H10000
Private Const As Long = &H20000
Private Const As Long = &H40000
Private Const As Long = &H80000
Private Const As Long = &H100000
Private Const As Long = &H200000
Private Const As Long = &H400000
Private Const As Long = &H800000
Private Const As Long = &H1000000
Private Const As Long = &H2000000
Private Const As Long = &H4000000
Private Const As Long = &H8000000
Private Const As Long = &H10000000
Private Const As Long = &H20000000
Private Const As Long = &H40000000
Private Const As Long = &H80000000
si no entendes te doy un ejemplo.