You are on page 1of 11

GESTIN PERMISOS USUARIOS1

INTRODUCCIN
Este ejemplo est basado en dos ejemplos que podris encontrar en la web: Formulario Chivato y Contrasea. Tras repetidas peticiones para saber cmo conceder determinados permisos a usuarios finalmente me he decidido a preparar este ejemplo, combinando las metodologas que podis encontrar en los ejemplos antes citados. Lo he situado en el apartado Ejemplos de aplicaciones porque, realmente, el ejemplo tiene cierta complejidad, y podra considerarse como un mdulo dentro de una aplicacin mayor. Os recomiendo que, si lo segus, lo hagis poco a poco y fijndoos en los detalles. Dado que consideraba complicado para la explicacin hacer modificaciones en los ejemplos anteriores voy a desarrollar este ejemplo empezando desde cero. As, si habis seguido los ejemplos anteriores, este probablemente servir para afianzar conocimientos, y si no los habis seguido pues no tendris que ir saltando de ejemplo en ejemplo para poder seguirlo. La metodologa que se explica aqu es slo una de las varias posibles. Lo comento porque es posible que, por la Red, encontris 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 informacin de los usuarios (nombre de usuario y contrasea) y adems los permisos que pueden tener. Para este ejemplo administraremos tres tipos de permisos (se pueden aadir cuantos queramos... slo que tendremos que programar un poquito ms... 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 aadir 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. Debera tener la siguiente estructura:

La BD de ejemplo os la podis bajar aqu. El password el mismo nombre de usuario que se elija, en minsculas.

Vistame en http://siliconproject.com.ar/neckkito/

Debemos tener en cuenta que los valores predeterminados para los campos [Administrador] e [Invitado] sern los que nos salen por defecto (es decir, un cero). El valor predeterminado para el campo [Operador] ser True (o tambin podemos escribir -1), porque se da por supuesto que cuando creemos un nuevo usuario este tendr, por defecto, este estatus de operador. Evidentemente, si quisiramos que los nuevos usuarios tuvieran slo permisos de invitado, deberamos asignar a este ltimo campo el valor predeterminado True. Tambin debemos tener en cuenta que al campo [Pass] podemos ponerle, como mscara de entrada, la mscara Contrasea, para que no se puedan ver los caracteres cuando se introduce la contrasea. 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 debera 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 diseo de este formulario, puesto que no lo veremos en ningn momento al trabajar con la BD. Debera ser tan simple como esto:

En el panel de exploracin o ventana de Base de datos, hacemos click derecho sobre la tabla Propiedades de la tabla Marcamos el check de Oculto.

Vistame en http://siliconproject.com.ar/neckkito/

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 Pestaa Otras Nombre, y ah le escribimos txtUser3 Tambin, 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 slo lo utilizaremos para hacer pruebas. Una vez creado, en la cabecera del formulario, insertamos un botn de comando. Le ponemos de nombre cmdCerrar y, en el evento Al hacer click, generamos el siguiente cdigo 4: Private Sub cmdCerrar_Click() DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FMenu" End Sub La primera lnea del DoCmd lo que hace es cerrar el formulario actual; la segunda lnea abre el formulario FMenu (que an no hemos creado, pero que crearemos en breve). En definitiva, nos debera 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 disearemos despus. Vamos a crear el formulario de acceso a la BD, que ser el que nos permitir seleccionar usuario y contrasea. Lo llamaremos FPass. Os muestro aqu cmo debera quedar, y despus
3 4 A partir de ahora, cuando diga, al referirme a un control, le ponemos de nombre..., me estar refiriendo a esta propiedad Nombre de la Pestaa Otras. Para generar cdigo nos ponemos en la parte en blanco junto al evento que queramos, y veremos cmo nos aparece un pequeo botn de puntos suspensivos. Si hacemos click sobre l nos aparecer una ventana. Le decimos que queremos generar cdigo. Se nos abrir el editor de VB, con dos lneas por defecto (Private Sub... y End Sub). Esas dos lneas no deben tocarse. El cdigo lo escribimos entre dichas lneas

Vistame en http://siliconproject.com.ar/neckkito/

os explicar cmo creamos los diferentes controles.

Si sacamos las propiedades del formulario nos vamos a la Pestaa 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 Aadimos slo el campo [NomUser] Podemos ordenar por [NomUser], ascendente (de la A a la Z) Le damos la dimensin 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 Despus de actualizar le generamos el siguiente cdigo: Private Sub cboUser_AfterUpdate() Me.txtPass.SetFocus End Sub Esto es para que el enfoque nos salte automticamente al siguiente control. 2.- Insertamos un cuadro de texto y en su etiqueta escribimos: Contrasea: Sacamos las propiedades de ese cuadro de texto y le ponemos de nombre txtPass 3.- Insertamos un botn de comando que nos permitir cancelar. Le ponemos de nombre cmdCancelar. En el evento Al hacer click le generamos el siguiente cdigo: Private Sub cmdCancelar_Click() 'Declaramos la variable Dim resp As Integer 'Solicitamos al usuario la confirmacin 4

Vistame en http://siliconproject.com.ar/neckkito/

resp = MsgBox("Seguro que desea cancelar?", vbQuestion + vbYesNo, "CONFIRMAR") 'Si responde que s quiere salir cerramos la aplicacin If resp = vbYes Then DoCmd.Quit End If End Sub 4.- Insertamos otro botn de comando, al que pondremos de nombre cmdAceptar. En el evento Al hacer click generamos el siguiente cdigo: 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 ningn usuario", vbInformation, "AVISO" Me.cboUser.SetFocus Exit Sub End If 'Si no se ha escrito ninguna contrasea salimos del proceso If vPass = "" Then MsgBox "No ha introducido ninguna contrasea", vbInformation, "AVISO" Me.txtPass.SetFocus Exit Sub End If 'Buscamos la contrasea que corresponde al usuario seleccionado vPassT = Nz(DLookup("[Pass]", "TPass", "[NomUser]='" & vUser & "'"), "") 'Comparamos la contrasea introducida con la contrasea de la tabla 'Si son diferentes... If vPassT <> vPass Then MsgBox "La contrasea 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"

Vistame en http://siliconproject.com.ar/neckkito/

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 continuos5. En definitiva, que nos debera quedar un formulario ms o menos con este diseo:

Sacamos las propiedades del formulario y nos vamos a Pestaa Datos Permitir agregar, y fijamos la propiedad en NO. Como vemos, hemos puesto un botn de comando (Cerrar), al que pondremos de nombre cmdCerrar. Al evento Al hacer click le generamos el siguiente cdigo: Private Sub cmdCerrar_Click() DoCmd.Close acForm, Me.Name DoCmd.OpenForm "FMenu" End Sub Vamos a programar este formulario para que slo nos deje dar un tipo de permiso para cada usuario. La mecnica es muy simple y repetitiva. 1.- Seleccionamos el check de Administrador. Sacamos sus propiedades y en el evento Despus de actualizar le generamos el siguiente cdigo: 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

Para usuarios de Access 2003 sacamos las propiedades del formulario Pestaa Formato Vista predeterminada, y ah seleccionamos Formularios continuos. Para versiones posteriores tenemos un botn en la cinta de opciones que nos crea el formulario directamente en esta vista (Botn Varios elementos)

Vistame en http://siliconproject.com.ar/neckkito/

2.- Seleccionamos el check de Operador y en su evento Despus de actualizar escribimos el siguiente cdigo: 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 Despus de actualizar del check de Invitado generamos el siguiente cdigo: . 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 rpido 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 Mdulo. Guardamos ese mdulo con el nombre de mdlTipoUsuario. 2.- Escribimos el siguiente cdigo en la ventana de cdigo, debajo de la lnea o lneas que, por defecto, nos habrn aparecido (Option Compare Database / Option Explicit): Public Function tipoUser() As String 'En la tabla TPass, el campo [Administrador] tiene el ndice 2,

Vistame en http://siliconproject.com.ar/neckkito/

'el campo [Operador] tiene el ndice 3, y el campo [Invitado] 'tiene el ndice 4. Capturaremos los campos en funcin 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 lnea correspondiente 'a la informacin 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 funcin '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 travs 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 travs 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 botn Se examina si tiene permiso a travs de la funcin 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 cdigos os darn error. Ojo! Todo lo que sigue, lgicamente, debe realizarse en FMenu 8

Vistame en http://siliconproject.com.ar/neckkito/

1.- Insertamos un botn de comando, al que llamaremos cmdAbreFDatos. Este botn nos abrir el formulario FDatos, teniendo en cuenta que: Si se es Administrador o se es Operador se pueden editar y aadir datos Si se es Invitado slo se pueden consultar los datos Para conseguir lo anterior, en el evento Al hacer click, programaremos el siguiente cdigo: Private Sub cmdAbreFDatos_Click() 'Declaramos las variables Dim vRol As String 'Cerramos el formulario actual DoCmd.Close acForm, Me.Name 'Llamamos a la funcin para saber qu permisos tiene vRol = tipoUser() 'Damos permisos en funcin del tipo de usuario If vRol = "Administrador" Or vRol = "Operador" Then 'Abrimos el formulario para aadir o editar DoCmd.OpenForm "FDatos" Else 'Si no es administrador u operador ser invitado. 'Abrimos el formulario slo para consulta DoCmd.OpenForm "FDatos", , , , acFormReadOnly End If End Sub

VARIACIN SOBRE EL TEMA


Supongamos que nuestro sistema de restricciones es el siguiente: El administrador puede modificar y aadir datos El operador slo puede editar datos, pero no puede aadir El invitado slo puede consultar datos, pero no modificarlos ni aadir de nuevos.

Si en nuestro FMenu aadimos otro botn de comando (lo llamaremos cmdAbreFDatos2) para cumplir lo anterior el cdigo asociado al evento Al hacer click debera 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 funcin para saber qu permisos tiene vRol = tipoUser() 'Damos permisos en funcin del tipo de usuario Select Case vRol Case "Administrador" 'Si es administrador abrimos el formulario con todos los permisos DoCmd.OpenForm "FDatos" 9

Vistame en http://siliconproject.com.ar/neckkito/

Case "Operador" 'Si es operador abrimos el formulario slo para ser editado, pero no para aadir DoCmd.OpenForm "FDatos" Forms!FDatos.AllowAdditions = False Case "Invitado" 'Si es invitado abrimos el formulario en slo lectura DoCmd.OpenForm "FDatos", , , , acFormReadOnly End Select End Sub Como podemos comprobar, la mecnica es muy simple: Analizo qu tipo de usuario es Determino lo que puede y no puede hacer. Sigamos con ms ejemplos 2.- Aadimos un botn de comando, que llamaremos cmdAbreRDatos. En este caso los permisos sern los siguientes: Administrador: puede acceder al informe Operador e invitado: no pueden acceder al informe

En el evento Al hacer click de ese botn escribimos el siguiente cdigo: Private Sub cmdAbreRDatos_Click() 'Declaramos las variables Dim vRol As String 'Llamamos a la funcin para saber qu permisos tiene vRol = tipoUser() 'Abrimos slo 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 botn de comando para administrar los permisos. Es decir, que claramente aqu slo el administrador puede tener acceso. A ese botn lo llamaremos cmdGestionPermisos. En el evento Al hacer click generamos el siguiente cdigo (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

Vistame en http://siliconproject.com.ar/neckkito/

10

MsgBox "No est autorizado a acceder a esta informacin", vbCritical, "NO AUTORIZADO" End If End Sub

UNAS PALABRAS FINALES


Bueno... Creo que en este ejemplo tenis un buen montn de herramientas para saber cmo conceder permisos y posibilidad de ejecutar acciones en funcin del permiso que se tenga. Si queris complementar este ejemplo con el ejemplo llamado Contrasea2, donde un usuario puede cambiar su contrasea sin recurrir a la intervencin del administrador, no creo que, si entendis la mecnica, tengis ningn problema en adaptar ambos ejemplos. Espero que todo lo anterior os sea til. Un saludo y... suerte!

Vistame en http://siliconproject.com.ar/neckkito/

11

You might also like