Está en la página 1de 11

GESTIÓN PERMISOS USUARIOS1

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://bit.ly/NckAccess
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 FORMULARIOS


Vamos 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”.

2
Visítame en http://bit.ly/NckAccess
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ódigo 4:


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

3
Visítame en http://bit.ly/NckAccess
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.SetFocus
End 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

4
Visítame en http://bit.ly/NckAccess
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 If
End 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"

5
Visítame en http://bit.ly/NckAccess
End If
End 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 With
End 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)

6
Visítame en http://bit.ly/NckAccess
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 With
End 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 With
End Sub

CREANDO UN INFORME DE PRUEBA


Vamos 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 USUARIOS


Vamos 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,

7
Visítame en http://bit.ly/NckAccess
'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 = Nothing
End 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 FMENU
La 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

8
Visítame en http://bit.ly/NckAccess
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 If
End Sub

VARIACIÓN SOBRE EL TEMA


Supongamos 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"

9
Visítame en http://bit.ly/NckAccess
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 Select
End 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 If
End 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

10
Visítame en http://bit.ly/NckAccess
MsgBox "No está autorizado a acceder a esta información", vbCritical, "NO AUTORIZADO"
End If
End Sub

UNAS PALABRAS FINALES


Bueno... 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!

11
Visítame en http://bit.ly/NckAccess