Autor Tema: Permisos para usuarios de software  (Leído 5705 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Permisos para usuarios de software
« 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
« última modificación: Diciembre 04, 2014, 08:46:04 pm por Jeronimo »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #1 en: Diciembre 04, 2014, 09:56:27 pm »
Hola yo estoy usando algo por el estilo te muestro que es lo que hago en partes

primer declaro unas contantes de este tipo
Código: [Seleccionar]
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

Código: [Seleccionar]
    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:

Código: [Seleccionar]
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

Código: [Seleccionar]
if  (p And PERMIT_CONF) = PERMIT_CONF then
   msgbox "puede entrar en la configuracion"
end if

Saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Permisos para usuarios de software
« Respuesta #2 en: Diciembre 04, 2014, 10:36:10 pm »
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
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #3 en: Diciembre 04, 2014, 11:58:47 pm »
¡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

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #4 en: Diciembre 05, 2014, 09:09:41 pm »
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.

Código: [Seleccionar]
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

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Permisos para usuarios de software
« Respuesta #5 en: Diciembre 06, 2014, 10:31:28 am »
Aca te dejo un ejemplo amigo





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
« última modificación: Diciembre 06, 2014, 10:53:21 am por E N T E R »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #6 en: Diciembre 06, 2014, 01:04:41 pm »
¡Genial! Ya lo pruebo.
Muchas gracias a todos por su tiempo. Son de gran ayuda para mí.
Saludos.

Jerónimo

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #7 en: Diciembre 19, 2014, 10:58:54 am »
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

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Permisos para usuarios de software
« Respuesta #8 en: Diciembre 19, 2014, 10:00:24 pm »
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


Código: [Seleccionar]
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.