11
GESTIÓN PERMISOS USUARIOS 1 INTRODUCCIÓN Este ejemplo está basado en dos ejemplos que podréis encontrar en la web: Formulario Chivato y Contraseña . Tras repetidas peticiones para saber cómo conceder determinados permisos a usuarios finalmente me he decidido a preparar este ejemplo, combinando las metodologías que podéis encontrar en los ejemplos antes citados. Lo he situado en el apartado “Ejemplos de aplicaciones” porque, realmente, el ejemplo tiene cierta complejidad, y podría considerarse como un módulo dentro de una aplicación mayor. Os recomiendo que, si lo seguís, lo hagáis poco a poco y fijándoos en los detalles. Dado que consideraba complicado para la explicación hacer modificaciones en los ejemplos anteriores voy a desarrollar este ejemplo empezando desde cero. Así, si habéis seguido los ejemplos anteriores, este probablemente servirá para “afianzar conocimientos”, y si no los habéis seguido pues no tendréis que ir “saltando de ejemplo en ejemplo” para poder seguirlo. La metodología que se explica aquí es sólo una de las varias posibles. Lo comento porque es posible que, por la Red, encontréis otros sistemas. Pues sí: hay otros sistemas. Dicho lo anterior, pues comencemos. PREPARANDO NUESTRA BASE DE DATOS Vamos a crear una nueva tabla, que nos recogerá la información de los usuarios (nombre de usuario y contraseña) y además los permisos que pueden tener. Para este ejemplo administraremos tres tipos de permisos (se pueden añadir cuantos queramos... sólo que tendremos que programar un poquito más... je, je...): Administrador: tiene potestad para realizar cualquier cosa con la base de datos (cuando digo cualquier cosa me refiero a los datos, no me refiero a nosotros mismos como administradores de la BD). Operador: tiene potestad para añadir registros, editarlos y modificarlos. No tiene potestad para acceder a aquellos objetos (formularios, consultas, informes) que sean de uso exclusivo del administrador. Invitado: tiene potestad para ver los datos, pero no puede modificarlos. Evidentemente tampoco tiene acceso a los objetos reservados de administrador. A esta nueva tabla la llamaremos TPass. Debería tener la siguiente estructura: 1 La BD de ejemplo os la podéis bajar aquí . El password el mismo nombre de usuario que se elija, en minúsculas. 1 Visítame en http://siliconproject.com.ar/neckkito/

Gest i on Permiso s Usuarios

Embed Size (px)

Citation preview

Page 1: Gest i on Permiso s Usuarios

GESTIÓN PERMISOS USUARIOS1

INTRODUCCIÓNEste ejemplo está basado en dos ejemplos que podréis encontrar en la web: Formulario Chivato y Contraseña.

Tras repetidas peticiones para saber cómo conceder determinados permisos a usuarios finalmente me he decidido a preparar este ejemplo, combinando las metodologías que podéis encontrar en los ejemplos antes citados.

Lo he situado en el apartado “Ejemplos de aplicaciones” porque, realmente, el ejemplo tiene cierta complejidad, y podría considerarse como un módulo dentro de una aplicación mayor. Os recomiendo que, si lo seguís, lo hagáis poco a poco y fijándoos en los detalles.

Dado que consideraba complicado para la explicación hacer modificaciones en los ejemplos anteriores voy a desarrollar este ejemplo empezando desde cero. Así, si habéis seguido los ejemplos anteriores, este probablemente servirá para “afianzar conocimientos”, y si no los habéis seguido pues no tendréis que ir “saltando de ejemplo en ejemplo” para poder seguirlo.

La metodología que se explica aquí es sólo una de las varias posibles. Lo comento porque es posible que, por la Red, encontréis otros sistemas. Pues sí: hay otros sistemas.

Dicho lo anterior, pues comencemos.

PREPARANDO NUESTRA BASE DE DATOSVamos a crear una nueva tabla, que nos recogerá la información de los usuarios (nombre de usuario y contraseña) y además los permisos que pueden tener. Para este ejemplo administraremos tres tipos de permisos (se pueden añadir cuantos queramos... sólo que tendremos que programar un poquito más... je, je...):– Administrador: tiene potestad para realizar cualquier cosa con la base de datos (cuando digo cualquier cosa me refiero a los datos, no me refiero a nosotros mismos como administradores de la BD).– Operador: tiene potestad para añadir registros, editarlos y modificarlos. No tiene potestad para acceder a aquellos objetos (formularios, consultas, informes) que sean de uso exclusivo del administrador.– Invitado: tiene potestad para ver los datos, pero no puede modificarlos. Evidentemente tampoco tiene acceso a los objetos reservados de administrador.

A esta nueva tabla la llamaremos TPass. Debería tener la siguiente estructura:

1 La BD de ejemplo os la podéis bajar aquí. El password el mismo nombre de usuario que se elija, en minúsculas.

1Visítame en http://siliconproject.com.ar/neckkito/

Page 2: Gest i on Permiso s Usuarios

Debemos tener en cuenta que los valores predeterminados para los campos [Administrador] e [Invitado] serán los que nos salen por defecto (es decir, un cero). El valor predeterminado para el campo [Operador] será True (o también podemos escribir -1), porque se da por supuesto que cuando creemos un nuevo usuario este tendrá, por defecto, este estatus de operador. Evidentemente, si quisiéramos que los nuevos usuarios tuvieran sólo permisos de invitado, deberíamos asignar a este último campo el valor predeterminado True.

También debemos tener en cuenta que al campo [Pass] podemos ponerle, como máscara de entrada, la máscara “Contraseña”, para que no se puedan ver los caracteres cuando se introduce la contraseña.

Para mayor seguridad podemos fijar el atributo de esta tabla como “Oculto”2.

Para poder hacer las pruebas pertinentes en este ejemplo vamos a crearnos una tabla cualquiera, que llamaremos TDatos, que tendrá simplemente la siguiente estructura.

Rellenamos esta tabla con algunos valores inventados. Por ejemplo, yo me he inventado lo siguiente:

Y, en principio, eso debería ser todo en cuanto a tablas.

PREPARANDO NUESTROS FORMULARIOSVamos a crearnos en primer lugar nuestro formulario que nos “chivará” el usuario que se halla en la BD. A este formulario lo llamaremos FChivato. No debemos preocuparnos demasiado por el diseño de este formulario, puesto que no lo veremos en ningún momento al trabajar con la BD.

Debería ser tan simple como esto:

2 En el panel de exploración o ventana de Base de datos, hacemos click derecho sobre la tabla Propiedades de la tabla Marcamos→ → el check de “Oculto”.

2Visítame en http://siliconproject.com.ar/neckkito/

Page 3: Gest i on Permiso s Usuarios

Como vemos, lo que tenemos que hacer es:

1.- Crear un formulario en blanco y guardarlo como FChivato.2.- Insertar un cuadro de texto, eliminando su etiqueta. A ese cuadro de texto le pondremos de nombre txtUser. Para ello sacamos las propiedades del cuadro de texto y nos vamos a Pestaña Otras Nombre, y ahí le escribimos→ txtUser3

También, para mayor seguridad, si queremos podemos establecer el atributo “Oculto” de este formulario.

Sigamos.

Ahora crearemos un formulario basado en la tabla TDatos. Lo guardaremos como FDatos. Pensad que este formulario sólo lo utilizaremos para hacer pruebas.

Una vez creado, en la cabecera del formulario, insertamos un botón de comando. Le ponemos de nombre cmdCerrar y, en el evento “Al hacer click”, generamos el siguiente código4:

…Private Sub cmdCerrar_Click() DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FMenu"End Sub…

La primera línea del DoCmd lo que hace es cerrar el formulario actual; la segunda línea abre el formulario FMenu (que aún no hemos creado, pero que crearemos en breve).

En definitiva, nos debería haber quedado una cosa así:

Creamos otro formulario en blanco, al que llamaremos FMenu. Este será nuestro “panel de control” para acceder a diferentes opciones que podamos crear en la BD. Lo dejaremos creado, y ya lo diseñaremos después.

Vamos a crear el formulario de acceso a la BD, que será el que nos permitirá seleccionar usuario y contraseña. Lo llamaremos FPass. Os muestro aquí cómo debería quedar, y después

3 A partir de ahora, cuando diga, al referirme a un control, “le ponemos de nombre...”, me estaré refiriendo a esta propiedad Nombre de la Pestaña Otras.

4 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos aparece un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le decimos que queremos generar código.Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben tocarse. El código lo escribimos entre dichas líneas

3Visítame en http://siliconproject.com.ar/neckkito/

Page 4: Gest i on Permiso s Usuarios

os explicaré cómo creamos los diferentes controles.

Si sacamos las propiedades del formulario nos vamos a la Pestaña Otras y situamos las siguientes propiedades en SI

– Emergente: SÍ– Modal: SÍ

Vamos a por los controles:

1.- Insertamos un cuadro combinado (etiqueta: Usuario:). Cuando nos salga el asistente lo configuramos de la siguiente manera:

– Deseo buscar los valores en una tabla– Seleccionamos la tabla TPass– Añadimos sólo el campo [NomUser]– Podemos ordenar por [NomUser], ascendente (de la A a la Z)– Le damos la dimensión que queramos al campo– Como nombre de etiqueta escribimos: Usuario:

Sacamos las propiedades de ese cuadro combinado y le ponemos de nombre cboUser

En el evento “Después de actualizar” le generamos el siguiente código:

…Private Sub cboUser_AfterUpdate() Me.txtPass.SetFocusEnd Sub…

Esto es para que el enfoque nos salte automáticamente al siguiente control.

2.- Insertamos un cuadro de texto y en su etiqueta escribimos: Contraseña:

Sacamos las propiedades de ese cuadro de texto y le ponemos de nombre txtPass

3.- Insertamos un botón de comando que nos permitirá cancelar. Le ponemos de nombre cmdCancelar. En el evento “Al hacer click” le generamos el siguiente código:

…Private Sub cmdCancelar_Click() 'Declaramos la variable Dim resp As Integer 'Solicitamos al usuario la confirmación

4Visítame en http://siliconproject.com.ar/neckkito/

Page 5: Gest i on Permiso s Usuarios

resp = MsgBox("¿Seguro que desea cancelar?", vbQuestion + vbYesNo, "CONFIRMAR") 'Si responde que sí quiere salir cerramos la aplicación If resp = vbYes Then DoCmd.Quit End IfEnd Sub…

4.- Insertamos otro botón de comando, al que pondremos de nombre cmdAceptar. En el evento “Al hacer click” generamos el siguiente código:

…Private Sub cmdAceptar_Click() 'Declaramos las variables Dim vUser As String Dim vPass As String Dim vPassT As String vUser = Nz(Me.cboUser.Value, "") vPass = Nz(Me.txtPass.Value, "") 'Si no se ha seleccionado un usuario salimos del proceso If vUser = "" Then MsgBox "No ha seleccionado ningún usuario", vbInformation, "AVISO" Me.cboUser.SetFocus Exit Sub End If 'Si no se ha escrito ninguna contraseña salimos del proceso If vPass = "" Then MsgBox "No ha introducido ninguna contraseña", vbInformation, "AVISO" Me.txtPass.SetFocus Exit Sub End If 'Buscamos la contraseña que corresponde al usuario seleccionado vPassT = Nz(DLookup("[Pass]", "TPass", "[NomUser]='" & vUser & "'"), "") 'Comparamos la contraseña introducida con la contraseña de la tabla 'Si son diferentes... If vPassT <> vPass Then MsgBox "La contraseña introducida no es correcta", _ vbInformation, "INCORRECTO" 'Situamos el enfoque en txtPass Me.txtPass.SetFocus 'Borramos el valor introducido Me.txtPass.Value = Null 'Salimos del proceso Exit Sub 'Si son iguales... Else 'Abrimos el formulario chivato en modo oculto DoCmd.OpenForm "FChivato", , , , , acHidden 'Pasamos el nombre de usuario a txtUser de FChivato Forms!FChivato.txtUser.Value = vUser 'Cerramos el formulario actual DoCmd.Close acForm, Me.Name 'Abrimos el formulario menú DoCmd.OpenForm "FMenu"

5Visítame en http://siliconproject.com.ar/neckkito/

Page 6: Gest i on Permiso s Usuarios

End IfEnd Sub…

Vamos a crearnos un formulario, que llamaremos FUsers, basado en la tabla TPass. La vista de este formulario será la de “Formularios continuos”5. En definitiva, que nos debería quedar un formulario más o menos con este diseño:

Sacamos las propiedades del formulario y nos vamos a Pestaña Datos Permitir agregar, y→ fijamos la propiedad en NO.

Como vemos, hemos puesto un botón de comando (Cerrar), al que pondremos de nombre cmdCerrar. Al evento “Al hacer click” le generamos el siguiente código:

…Private Sub cmdCerrar_Click() DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FMenu"End Sub…

Vamos a programar este formulario para que sólo nos deje dar un tipo de permiso para cada usuario. La mecánica es muy simple y repetitiva.

1.- Seleccionamos el check de “Administrador”. Sacamos sus propiedades y en el evento “Después de actualizar” le generamos el siguiente código:

…Private Sub Administrador_AfterUpdate() With Me 'Si marcamos el check de administrador el resto de checks 'se desmarcan If .Administrador.Value = True Then .Operador.Value = False .Invitado.Value = False End If End WithEnd Sub…

5 Para usuarios de Access 2003 sacamos las propiedades del formulario Pestaña Formato Vista predeterminada, y ahí→ → seleccionamos “Formularios continuos”. Para versiones posteriores tenemos un botón en la cinta de opciones que nos crea el formulario directamente en esta vista (Botón Varios elementos)→

6Visítame en http://siliconproject.com.ar/neckkito/

Page 7: Gest i on Permiso s Usuarios

2.- Seleccionamos el check de “Operador” y en su evento “Después de actualizar escribimos el siguiente código:

…Private Sub Operador_AfterUpdate() With Me 'Si marcamos el check de operador el resto de checks 'se desmarcan If .Operador.Value = True Then .Administrador.Value = False .Invitado.Value = False End If End WithEnd Sub…

3.- Finalmente, en el evento “Después de actualizar” del check de “Invitado” generamos el siguiente código:

….Private Sub Invitado_AfterUpdate() With Me 'Si marcamos el check de invitado el resto de checks 'se desmarcan If .Invitado.Value = True Then .Operador.Value = False .Administrador.Value = False End If End WithEnd Sub…

CREANDO UN INFORME DE PRUEBAVamos a crear un informe rápido sobre la tabla TDatos. Guardaremos ese informe como RDatos.

Este informe nos servirá para practicar con los permisos.

PROGRAMANDO EL CONTROL DE USUARIOSVamos a programar la rutina que nos determinará el tipo de usuario que se halla en ese momento en la BD. Haremos lo siguiente:

1.- En el editor de VB nos vamos a menú Insertar Módulo. Guardamos ese módulo con el→ nombre de mdlTipoUsuario.

2.- Escribimos el siguiente código en la ventana de código, debajo de la línea o líneas que, por defecto, nos habrán aparecido (Option Compare Database / Option Explicit):

…Public Function tipoUser() As String 'En la tabla TPass, el campo [Administrador] tiene el índice 2,

7Visítame en http://siliconproject.com.ar/neckkito/

Page 8: Gest i on Permiso s Usuarios

'el campo [Operador] tiene el índice 3, y el campo [Invitado] 'tiene el índice 4. Capturaremos los campos en función de su 'índice, que viene representado por la variable vInd'-------------------- ---------------------------------------------------------

'Declaramos las variables Dim nombreUsuario As String Dim tipUs As Boolean Dim vInd As Integer Dim rst As Recordset Dim miSql As String 'Capturamos el nombre de usuario del formulario FChivato nombreUsuario = Forms!FChivato.txtUser.Value

'Creamos la consulta SQL que nos filtrará la línea correspondiente 'a la información del usuario activo miSql = "SELECT * FROM TPass WHERE NomUser='" & nombreUsuario & "'" 'Definimos el recordset sobre la SQL Set rst = CurrentDb.OpenRecordset(miSql, dbOpenSnapshot) 'Empezamos a recorrer los campos, y nos detendremos en aquel que tenga 'el check marcado (es decir, que sea TRUE) For vInd = 2 To 4 tipUs = rst.Fields(vInd).Value 'Si está marcado como verdadero pasamos como resultado de la función 'el nombre del campo If tipUs = True Then tipoUser = rst.Fields(vInd).Name Exit For End If Next vInd 'Cerramos conexiones y liberamos memoria rst.Close Set rst = NothingEnd Function…

Y con esto ya tenemos el grueso del trabajo hecho. Vamos a seguir estableciendo lo que se puede o no a través del formulario FMenu.

PROGRAMANDO FMENULa idea subyacente de todo lo que hemos hecho anteriormente es que el usuario de la base siga este “camino”.

– Entra en la BD a través del formulario de password de ahí se obtiene el nombre de→ usuario– Se llega al menú (FMenu). En FMenu tendremos botones para realizar diversas opciones.– El usuario clicka un botón Se examina si tiene permiso a través de la función Se le→ → deja acceder (con restricciones o no) o no se le deja acceder.

Si queremos ir haciendo pruebas tened en cuenta que, antes de abrir FMenu, debemos pasar obligatoriamente por abrir FPass, puesto que es ahí cuando el control txtUser de FChivato adquiere valor. Si no hay valor en txtUser todos los códigos os darán error. ¡Ojo!

Todo lo que sigue, lógicamente, debe realizarse en FMenu

8Visítame en http://siliconproject.com.ar/neckkito/

Page 9: Gest i on Permiso s Usuarios

1.- Insertamos un botón de comando, al que llamaremos cmdAbreFDatos. Este botón nos abrirá el formulario FDatos, teniendo en cuenta que:

– Si se es “Administrador” o se es “Operador” se pueden editar y añadir datos– Si se es “Invitado” sólo se pueden consultar los datos

Para conseguir lo anterior, en el evento “Al hacer click”, programaremos el siguiente código:

…Private Sub cmdAbreFDatos_Click() 'Declaramos las variables Dim vRol As String 'Cerramos el formulario actual DoCmd.Close acForm, Me.Name 'Llamamos a la función para saber qué permisos tiene vRol = tipoUser() 'Damos permisos en función del tipo de usuario If vRol = "Administrador" Or vRol = "Operador" Then 'Abrimos el formulario para añadir o editar DoCmd.OpenForm "FDatos" Else 'Si no es administrador u operador será invitado. 'Abrimos el formulario sólo para consulta DoCmd.OpenForm "FDatos", , , , acFormReadOnly End IfEnd Sub…

VARIACIÓN SOBRE EL TEMASupongamos que nuestro sistema de restricciones es el siguiente:

– El administrador puede modificar y añadir datos– El operador sólo puede editar datos, pero no puede añadir– El invitado sólo puede consultar datos, pero no modificarlos ni añadir de nuevos.

Si en nuestro FMenu añadimos otro botón de comando (lo llamaremos cmdAbreFDatos2) para cumplir lo anterior el código asociado al evento “Al hacer click” debería ser el siguiente:

…Private Sub cmdAbreFDatos2_Click() 'Declaramos las variables Dim vRol As String 'Cerramos el formulario actual DoCmd.Close acForm, Me.Name 'Llamamos a la función para saber qué permisos tiene vRol = tipoUser() 'Damos permisos en función del tipo de usuario Select Case vRol Case "Administrador" 'Si es administrador abrimos el formulario con todos los permisos DoCmd.OpenForm "FDatos"

9Visítame en http://siliconproject.com.ar/neckkito/

Page 10: Gest i on Permiso s Usuarios

Case "Operador" 'Si es operador abrimos el formulario sólo para ser editado, pero no para añadir

DoCmd.OpenForm "FDatos" Forms!FDatos.AllowAdditions = False Case "Invitado" 'Si es invitado abrimos el formulario en sólo lectura DoCmd.OpenForm "FDatos", , , , acFormReadOnly End SelectEnd Sub…

Como podemos comprobar, la mecánica es muy simple:– Analizo qué tipo de usuario es– Determino lo que puede y no puede hacer.

Sigamos con más ejemplos

2.- Añadimos un botón de comando, que llamaremos cmdAbreRDatos. En este caso los permisos serán los siguientes:

– Administrador: puede acceder al informe– Operador e invitado: no pueden acceder al informe

En el evento “Al hacer click” de ese botón escribimos el siguiente código:

…Private Sub cmdAbreRDatos_Click() 'Declaramos las variables Dim vRol As String 'Llamamos a la función para saber qué permisos tiene vRol = tipoUser() 'Abrimos sólo si se es administrador If vRol = "Administrador" Then 'Abrimos el informe DoCmd.OpenReport "RDatos", acViewPreview Else 'Si no lanzamos un mensaje de advertencia MsgBox "No tiene privilegios para ver este informe", vbCritical, "NO AUTORIZADO" End IfEnd Sub…

3.- Para practicar con lo anterior, vamos a crear un botón de comando para administrar los permisos. Es decir, que claramente aquí sólo el administrador puede tener acceso. A ese botón lo llamaremos cmdGestionPermisos. En el evento “Al hacer click” generamos el siguiente código (ya no os pondré los comentarios):

…Private Sub cmdGestionPermisos_Click() Dim vRol As String vRol = tipoUser() If vRol = "Administrador" Then DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FUsers" Else

10Visítame en http://siliconproject.com.ar/neckkito/

Page 11: Gest i on Permiso s Usuarios

MsgBox "No está autorizado a acceder a esta información", vbCritical, "NO AUTORIZADO" End IfEnd Sub…

UNAS PALABRAS FINALESBueno... Creo que en este ejemplo tenéis un buen montón de herramientas para saber cómo conceder permisos y posibilidad de ejecutar acciones en función del permiso que se tenga.

Si queréis complementar este ejemplo con el ejemplo llamado “Contraseña2”, donde un usuario puede cambiar su contraseña sin recurrir a la intervención del administrador, no creo que, si entendéis la mecánica, tengáis ningún problema en adaptar ambos ejemplos.

Espero que todo lo anterior os sea útil.

Un saludo y...

¡suerte!

11Visítame en http://siliconproject.com.ar/neckkito/