Crear seguridad de usuarios en access 2007
Hola a todos.
Tengo una bd creada en access 2007 y estoy intentando crear un sistema para poner permisos a los usuarios que entran en la bd.
Me he ido fijando de la estructura de la bd northwind y he puesto la misma estructura de tablas para controlar los usuarios: una tabla empleados, privilegios, tipo de privilegios. Pero el código de nothwind no lo entiendo para poder poner a los usuarios que se registran limitar el acceso a determinados formularios de la bd.
Si alguien sabe una forma de poder controlar eso, o sabe algún código para poder poner una seguridad de usuarios en Access 2007, porque como no lleva la seguridad incorporada que llevaba el 2003.
Por favor échenme una mano.
Un saludo.
Tengo una bd creada en access 2007 y estoy intentando crear un sistema para poner permisos a los usuarios que entran en la bd.
Me he ido fijando de la estructura de la bd northwind y he puesto la misma estructura de tablas para controlar los usuarios: una tabla empleados, privilegios, tipo de privilegios. Pero el código de nothwind no lo entiendo para poder poner a los usuarios que se registran limitar el acceso a determinados formularios de la bd.
Si alguien sabe una forma de poder controlar eso, o sabe algún código para poder poner una seguridad de usuarios en Access 2007, porque como no lleva la seguridad incorporada que llevaba el 2003.
Por favor échenme una mano.
Un saludo.
1 Respuesta
Respuesta de xavi -ae soft-
1
1
xavi -ae soft-, 20años de experiencia en programacion Access a razon de 10 horas...
La seguridad en Access 2007 la debes crear tu. Yo utilizo varias tablas para establecerla: objetos, usuarios, roles, niveles y una relación entre usuario-rol-nivel.
La tabla de objetos contiene (como mínimo) los formularios de mi aplicación.
La tabla de usuarios contiene eso: los usuarios
La tabla de roles me sirve para agrupar ciertos permisos sobre formularios según la información que van a mostrar.
La tabla niveles (que no es estrictamente necesaria) es una tabla con los valores: Administrador, Edición, Lectura, Nada.
A cada objeto formulario de mi tabla de objetos le asigno un rol.
A cada usuario le asigno los roles posibles y su nivel de acceso. Si a un usuario no le asigno valor para un rol no pasa nada: en el código, si no encuentro esa combinación... pues no accede.
Una vez definidas (y rellenas) esas tablas, deberíamos implementar la seguridad.
Yo manejo el evento Open del formulario y llamo a una finción (en un módulo independiente) que evalúa los permisos para el usuario y el objeto. En función del nivel, permito su acceso o no y lo que puede tocar o no.
La verdad es que requiere un poco de esfuerzo y seguro que no es inviolable, pero de momento me funciona.
Todo esto es para Access. Creo que si utilizas otro sgbd de backend (SQL Server, por ejemplo) puedes establecer permisos a nivel de tabla.
La tabla de objetos contiene (como mínimo) los formularios de mi aplicación.
La tabla de usuarios contiene eso: los usuarios
La tabla de roles me sirve para agrupar ciertos permisos sobre formularios según la información que van a mostrar.
La tabla niveles (que no es estrictamente necesaria) es una tabla con los valores: Administrador, Edición, Lectura, Nada.
A cada objeto formulario de mi tabla de objetos le asigno un rol.
A cada usuario le asigno los roles posibles y su nivel de acceso. Si a un usuario no le asigno valor para un rol no pasa nada: en el código, si no encuentro esa combinación... pues no accede.
Una vez definidas (y rellenas) esas tablas, deberíamos implementar la seguridad.
Yo manejo el evento Open del formulario y llamo a una finción (en un módulo independiente) que evalúa los permisos para el usuario y el objeto. En función del nivel, permito su acceso o no y lo que puede tocar o no.
La verdad es que requiere un poco de esfuerzo y seguro que no es inviolable, pero de momento me funciona.
Todo esto es para Access. Creo que si utilizas otro sgbd de backend (SQL Server, por ejemplo) puedes establecer permisos a nivel de tabla.
Muchas gracias por tu contestación.
Pero necesito más ayuda.
Yo tengo la tabla usuarios creada, la tabla privilegios.
No te entiendo lo de la tabla objetos, como pongo en esa tabla los formularios de mi bd y como asigno los roles a los usuarios, no entiendo esto.
Y por favor a ve si me puedes ayudar con el código para controlar el acceso de los usuarios, te lo agradecería.
Muchas gracias y un saludo.
Pero necesito más ayuda.
Yo tengo la tabla usuarios creada, la tabla privilegios.
No te entiendo lo de la tabla objetos, como pongo en esa tabla los formularios de mi bd y como asigno los roles a los usuarios, no entiendo esto.
Y por favor a ve si me puedes ayudar con el código para controlar el acceso de los usuarios, te lo agradecería.
Muchas gracias y un saludo.
Access dispone de una tabla objetos del sistema (MSysObjects o algo parecido) pero esa tabla no la puedes tocar.
Ya que no la podemos tocar y queremos asociar ciertos privilegios a ciertos formularios, lo suyo es crear (y mantener, que se nos olvida muchas veces, yo el primero) una tabla propia de objetos.
En esa tabla tengo un campo de texto dónde escribo el nombre del formulario (podría rellenarlo a partir de la tabla MSysObjects, pero ese ya es otro tema y también requiere lanzar el proceso periódicamente)
También tengo un campo para decidir el rol que va a tener ese formulario. Imaginemos una aplicación muy completa dónde hay un apartado de nóminas. No todo el mundo debe poder acceder a esa información. Así me creo un rol llamado Nominas y lo asigno a todos los registros de la tabla Objetos que sean formularios susceptibles de presentar datos sobre las nominas.
Despues tengo una subtabla (RolesUsuario) con 3 campos: IdUsuario, IdRol, Nivel.
Para cada usuario y rol, defino un nivel de acceso. Así, el usuario Xavi, para el Rol Nominas, le digo que no tiene acceso. En cambio, para el usuario iuliano, para el mismo rol, si que le doy acceso.
En la apertura de cada formulario, y sabiendo el usuario validado en la aplicación (me supongo que tienes eso solucionado), puedo recuperar el rol asociado a ese objeto (de la tabla de objetos) y mirar en la tabla RolesUsuario el nivel que el usuario tiene para ese rol.
No se si me explico...
PD: muy probablemente esté desconectado hasta el lunes por la tarde.
Ya que no la podemos tocar y queremos asociar ciertos privilegios a ciertos formularios, lo suyo es crear (y mantener, que se nos olvida muchas veces, yo el primero) una tabla propia de objetos.
En esa tabla tengo un campo de texto dónde escribo el nombre del formulario (podría rellenarlo a partir de la tabla MSysObjects, pero ese ya es otro tema y también requiere lanzar el proceso periódicamente)
También tengo un campo para decidir el rol que va a tener ese formulario. Imaginemos una aplicación muy completa dónde hay un apartado de nóminas. No todo el mundo debe poder acceder a esa información. Así me creo un rol llamado Nominas y lo asigno a todos los registros de la tabla Objetos que sean formularios susceptibles de presentar datos sobre las nominas.
Despues tengo una subtabla (RolesUsuario) con 3 campos: IdUsuario, IdRol, Nivel.
Para cada usuario y rol, defino un nivel de acceso. Así, el usuario Xavi, para el Rol Nominas, le digo que no tiene acceso. En cambio, para el usuario iuliano, para el mismo rol, si que le doy acceso.
En la apertura de cada formulario, y sabiendo el usuario validado en la aplicación (me supongo que tienes eso solucionado), puedo recuperar el rol asociado a ese objeto (de la tabla de objetos) y mirar en la tabla RolesUsuario el nivel que el usuario tiene para ese rol.
No se si me explico...
PD: muy probablemente esté desconectado hasta el lunes por la tarde.
Gracias de nuevo por contestar.
Te explico lo que yo tengo montado.
Tengo una tabla de usuarios con idusuario, nombre_usuario y password.
Una tabla de privilegios idprivilegio, nombreprivilegio y tabla de privilegios de empleado idusuario y idprivilegio.
Tengo un formulario que me pide nombre de usuario y contraseña, pero no se muy bien como guardar el nombre que introducimos para después que me lo reconozca para los permisos.
Entonces lo que tu me dices es que en la tabla de objetos que creo, ponga los nombres de los formularios y pongo los roles en otro campo, por ejemplo yo tengo un formulario de productos que solo quiero que los modifique una persona y pongo formulario productos, con el rol productos por ej.
Y después en la tabla roles indico al usuario que quiera el rol productos. No entiendo muy bien lo del acceso como lo pongo.
Ni tampoco en el evento al cargar el formulario, el código que debo poner para verificar en la tabla objetos y roles, el usuario que metemos al principio.
Muchas gracias.
Te explico lo que yo tengo montado.
Tengo una tabla de usuarios con idusuario, nombre_usuario y password.
Una tabla de privilegios idprivilegio, nombreprivilegio y tabla de privilegios de empleado idusuario y idprivilegio.
Tengo un formulario que me pide nombre de usuario y contraseña, pero no se muy bien como guardar el nombre que introducimos para después que me lo reconozca para los permisos.
Entonces lo que tu me dices es que en la tabla de objetos que creo, ponga los nombres de los formularios y pongo los roles en otro campo, por ejemplo yo tengo un formulario de productos que solo quiero que los modifique una persona y pongo formulario productos, con el rol productos por ej.
Y después en la tabla roles indico al usuario que quiera el rol productos. No entiendo muy bien lo del acceso como lo pongo.
Ni tampoco en el evento al cargar el formulario, el código que debo poner para verificar en la tabla objetos y roles, el usuario que metemos al principio.
Muchas gracias.
Por partes.
Guardar el usuario validado. Utiliza una variable publica con el idusuario.
Entiendo que lo que yo namo roles, tu lo llamas privilegios. Es una simple cuestión semántica.
Lo que no veo es que guardes su nivel de acceso, pero tampoco es crítico, porque también puedes utilizar la presencia del privilegio como que puede acceder y la ausencia como que no puede acceder. Yo utilizo el nivel porque distintos usuarios tienen distintos niveles para los datos (denegado, solo lectura, lectura+edicion, lectura+edicion+insercion, lectura+edicion+insercion+eliminación)
Imaginemos que tu solo vas a controlar que un usuario dispone de un determinado privilegio.
El usuario lo tenemos en la variable publica intActiveUser. En la tabla de objetos tenemos un registro que tiene estos valores: NombreFormulario: frmProductos, Privilegio: Productos. En la tabla de privilegios por usuario tienes establecida una relación entre el usuario iuliano (id = 1) y el privilegio Productos. Pero no la tienes establecida entre el usuario xavi (id = 2) y el mismo privilegio. Interpretamos eso como que el usuario iuliano podrá acceder a los datos de ese formulario y, en cambio, el usuario xavi no podrá.
Dado que podemos utilizar muchas veces ese código en distintos formularios, lo más indicado seria la creación de una función pública que nos diga si ese usuario puede acceder a los datos.
Para ello creamos una función publica que colocamos en un módulo independiente. Llamemos a la función VerAcceso. Esa función recibirá un parámetro (el formulario que queremos abrir) y nos devolverá un valor boolean que nos indica si el usuario puede o no acceder a los datos.
Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "tblObjetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox"El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
Muy bien, ya tenemos la función universal para ver si el usuario puede acceder. Veamos ahora como y donde la aplicamos. Utilizamos el evento Open de cada formulario y llamamos a la función:
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then Cancel = True
' es decir, si no tiene acceso, cancelamos la apertura del formulario.
' alternativa
Cancel = Not VerAccesso(Me)
' aunque seria mejor avisar al usuario..
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
A ver si así te vale
Guardar el usuario validado. Utiliza una variable publica con el idusuario.
Entiendo que lo que yo namo roles, tu lo llamas privilegios. Es una simple cuestión semántica.
Lo que no veo es que guardes su nivel de acceso, pero tampoco es crítico, porque también puedes utilizar la presencia del privilegio como que puede acceder y la ausencia como que no puede acceder. Yo utilizo el nivel porque distintos usuarios tienen distintos niveles para los datos (denegado, solo lectura, lectura+edicion, lectura+edicion+insercion, lectura+edicion+insercion+eliminación)
Imaginemos que tu solo vas a controlar que un usuario dispone de un determinado privilegio.
El usuario lo tenemos en la variable publica intActiveUser. En la tabla de objetos tenemos un registro que tiene estos valores: NombreFormulario: frmProductos, Privilegio: Productos. En la tabla de privilegios por usuario tienes establecida una relación entre el usuario iuliano (id = 1) y el privilegio Productos. Pero no la tienes establecida entre el usuario xavi (id = 2) y el mismo privilegio. Interpretamos eso como que el usuario iuliano podrá acceder a los datos de ese formulario y, en cambio, el usuario xavi no podrá.
Dado que podemos utilizar muchas veces ese código en distintos formularios, lo más indicado seria la creación de una función pública que nos diga si ese usuario puede acceder a los datos.
Para ello creamos una función publica que colocamos en un módulo independiente. Llamemos a la función VerAcceso. Esa función recibirá un parámetro (el formulario que queremos abrir) y nos devolverá un valor boolean que nos indica si el usuario puede o no acceder a los datos.
Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "tblObjetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox"El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
Muy bien, ya tenemos la función universal para ver si el usuario puede acceder. Veamos ahora como y donde la aplicamos. Utilizamos el evento Open de cada formulario y llamamos a la función:
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then Cancel = True
' es decir, si no tiene acceso, cancelamos la apertura del formulario.
' alternativa
Cancel = Not VerAccesso(Me)
' aunque seria mejor avisar al usuario..
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
A ver si así te vale
Hola, muchas gracias!
He seguido todos tus pasos, pero tengo una duda, ¿cómo guardo en una variable pública el nombre de usuario que elijo del combobox?
Yo tengo un formulario de control de usuario, en el que tengo un combobox para elegir el nombre de usuario y otro textbox para escribir la contraseña. Y tengo un botón de comando para que valide esto. ¿Cómo puedo hacer lo de la variable pública?
Lo demás ya lo he hecho, pero cuando ejecuto el formulario productos me da un error de código en veracceso.
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
Muchas gracias otra vez.
He seguido todos tus pasos, pero tengo una duda, ¿cómo guardo en una variable pública el nombre de usuario que elijo del combobox?
Yo tengo un formulario de control de usuario, en el que tengo un combobox para elegir el nombre de usuario y otro textbox para escribir la contraseña. Y tengo un botón de comando para que valide esto. ¿Cómo puedo hacer lo de la variable pública?
Lo demás ya lo he hecho, pero cuando ejecuto el formulario productos me da un error de código en veracceso.
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
Muchas gracias otra vez.
Punto 1: la variable.
En un modulo independiente, declara la variable intActiveUser.
Public intActiveUser As Integer
En el evento click del botón situado en el formulario dónde validas que el usuario sea correcto, asigna el valor del idusuario a la variable.
Punto 2: la llamada a la función. Cuando se produce un error, lo suyo seria que me indicaras cual es el error. Ten en cuenta que yo no tengo una base de datos como la tuya. De hecho, ni siquiera tengo una base de datos para probar lo que que te digo, al menos no una "limpia". Lo que te comento es parte de un proceso mucho más complejo que yo utilizo... vamos, que te lo escribo del tirón.
Me temo que pueden haber varias posibles causas:
- La función está en un módulo que depende de un objeto (formulario o informe) --> debe estar en un módulo independiente
- Estando en un modulo independiente, la función este declarada como Private --> debe ser Public o, dado que es un modulo independiente, se sobreentiende que es public ante la ausencia de esa parte.
- Estando en un módulo publico y declarada como tal (explícitamente o por omisión), el módulo se llama igual que la función (VerAcceso). Access no sabe a que estas haciendo referencia --> cambia el nombre del módulo a mdlVerAcceso, por ejemplo.
- Otro error que ahora se me escapa...
En un modulo independiente, declara la variable intActiveUser.
Public intActiveUser As Integer
En el evento click del botón situado en el formulario dónde validas que el usuario sea correcto, asigna el valor del idusuario a la variable.
Punto 2: la llamada a la función. Cuando se produce un error, lo suyo seria que me indicaras cual es el error. Ten en cuenta que yo no tengo una base de datos como la tuya. De hecho, ni siquiera tengo una base de datos para probar lo que que te digo, al menos no una "limpia". Lo que te comento es parte de un proceso mucho más complejo que yo utilizo... vamos, que te lo escribo del tirón.
Me temo que pueden haber varias posibles causas:
- La función está en un módulo que depende de un objeto (formulario o informe) --> debe estar en un módulo independiente
- Estando en un modulo independiente, la función este declarada como Private --> debe ser Public o, dado que es un modulo independiente, se sobreentiende que es public ante la ausencia de esa parte.
- Estando en un módulo publico y declarada como tal (explícitamente o por omisión), el módulo se llama igual que la función (VerAcceso). Access no sabe a que estas haciendo referencia --> cambia el nombre del módulo a mdlVerAcceso, por ejemplo.
- Otro error que ahora se me escapa...
Yo he creado un modulo como me has dicho para declarar la variable y puesto sólo esto en el módulo intactiveuser.
Public Intactiveuser As Integer
¿Cómo asigno ahora el valor del idusuario que pongo en combobox a la variable en el botón de comando y se me abre el formulario del control de formularios?
También me da un erro en la función publica veraccesso, en
vbinformation, "AVISO"
uN SALUDO
Public Intactiveuser As Integer
¿Cómo asigno ahora el valor del idusuario que pongo en combobox a la variable en el botón de comando y se me abre el formulario del control de formularios?
También me da un erro en la función publica veraccesso, en
vbinformation, "AVISO"
uN SALUDO
Suponiendo que el combo dónde se selecciona el usuario tenga, como columna dependiente, aquella que contiene el idusuario (debería ser así), te basta con este código:
intactiveuser = Me!elcombo
En el evento click del botón de acceder y justo después de validar que la contraseña es correcta.
Sigues sin decirme cual es el error ni dónde se produce. Ejecuta paso a paso y me dices dónde salta y QUE PONE el error.
Xavi
intactiveuser = Me!elcombo
En el evento click del botón de acceder y justo después de validar que la contraseña es correcta.
Sigues sin decirme cual es el error ni dónde se produce. Ejecuta paso a paso y me dices dónde salta y QUE PONE el error.
Xavi
He puesto en el evento hacer click del botón esta función y cuando le pincho me da este error. Me subraya intactiveuser
Private Sub cmdLogin_Click()
Intactiveuser = Me!cboCurrentEmployee
End Sub
la password voy a pasar de controlarla porque ya es meterme en más complicaciones.
Mira tengo la función publica para intaciveuser (declararla así)
Function Intactiveuser(frmAccess As Form) As Boolean
Public Intactiveuser As Integer
End Function
No se si me falta algo o como puedo controlarlo.
Private Sub cmdLogin_Click()
Intactiveuser = Me!cboCurrentEmployee
End Sub
la password voy a pasar de controlarla porque ya es meterme en más complicaciones.
Mira tengo la función publica para intaciveuser (declararla así)
Function Intactiveuser(frmAccess As Form) As Boolean
Public Intactiveuser As Integer
End Function
No se si me falta algo o como puedo controlarlo.
Me permitirás la confianza, pero vas absolutamente perdido.
Lee bien mi escrito del día 21 porque te has inventado cosas que yo no he dicho.
Lee bien mi escrito del día 21 porque te has inventado cosas que yo no he dicho.
No me he inventado nada. He hecho todo lo que me has dicho, pero no me has dicho como declaro la variable intactiveuser y como en el botón asigno esa variable.
Porque necesito controlar el usuario que elijo en el combobox y la contraseña que pongo en el cuadro de texto me la compare con el campo password de la tabla empleado.
Ya tengo casi todo a punto, me faltan detallitos, je je
Perdona por molestarte tanto, pero es que necesito hacer funcionar esto como sea.
Muchas gracias.
Porque necesito controlar el usuario que elijo en el combobox y la contraseña que pongo en el cuadro de texto me la compare con el campo password de la tabla empleado.
Ya tengo casi todo a punto, me faltan detallitos, je je
Perdona por molestarte tanto, pero es que necesito hacer funcionar esto como sea.
Muchas gracias.
Entonces repasa todo lo que te he dicho.
Partamos de la base que tienes una tabla de usuarios: idusuario, nombre_usuario, password.
Tienes un formulario para validar la entrada con 1 combobox, un textbox y (al menos) 1 botón.
Combo: cboUsuario, basado en la tabla de usuarios a tres columnas, siendo la primera de ellas la dependiente. La anchura de la primera y la ultima columna (idusuario y password) debes ser 0.
Textbox: txtPassword. Con máscara de entrada establecida a Contraseña.
Botón: cmdLogin. Ahí debes validar que el usuario y la contraseña coinciden y asignar el valor a la variable.
Paréntesis: la variable intActiveUser que debe almacenar el valor del usuario actual debe definirse en un módulo independiente el nombre del cual no entre en conflicto con otros objetos, funciones o variables de la aplicación. Yo llamaría al módulo mdlControlAccessos y la variable la definiría así:
Public intActiveUser As Integer
Fin paréntesis
Vamos por el código del botón:
Private Sub cmdLogin_Click()
If Me!txtPassword <> Me!cboUsuario.Column(2) Then
' utilizo el indice de la columna = 2 porque se empieza por 0.
MsgBox "El password es erroneo.", vbCritical, "AVISO"
Me!txtPassword = vbNullString
Me!txtPassword.SetFocus
Exit Sub
End If
' Si estamos aquí es porque el password es correcto. Asignamos el valor del combo a la variable publica:
intActiveUser = Me!cboUsuario.Value
End Sub
Bien, ya tenemos como validar la contraseña y establecer el valor de la variable.
Veamos ahora como establecer los permisos al entrar en un formulario. En el mismo módulo dónde hemos declarado la variable, vamos a meter la función que te indicaba. Se supone que tienes las tablas de privilegios y objetos tal como ya te había comentado.
Public Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "tblObjetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox"El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
Esa función devuelve True si el usuario tiene el privilegio de ver esos datos o false si no los tiene.
Se trata de evaluar ese resultado en el evento Open de cada formulario para saber si el usuario tiene acceso o no.
Y... ya está.
He repasado todos mis mensajes en este hilo y no veo que ahora haya dicho nada distinto a lo dicho anteriormente...
Partamos de la base que tienes una tabla de usuarios: idusuario, nombre_usuario, password.
Tienes un formulario para validar la entrada con 1 combobox, un textbox y (al menos) 1 botón.
Combo: cboUsuario, basado en la tabla de usuarios a tres columnas, siendo la primera de ellas la dependiente. La anchura de la primera y la ultima columna (idusuario y password) debes ser 0.
Textbox: txtPassword. Con máscara de entrada establecida a Contraseña.
Botón: cmdLogin. Ahí debes validar que el usuario y la contraseña coinciden y asignar el valor a la variable.
Paréntesis: la variable intActiveUser que debe almacenar el valor del usuario actual debe definirse en un módulo independiente el nombre del cual no entre en conflicto con otros objetos, funciones o variables de la aplicación. Yo llamaría al módulo mdlControlAccessos y la variable la definiría así:
Public intActiveUser As Integer
Fin paréntesis
Vamos por el código del botón:
Private Sub cmdLogin_Click()
If Me!txtPassword <> Me!cboUsuario.Column(2) Then
' utilizo el indice de la columna = 2 porque se empieza por 0.
MsgBox "El password es erroneo.", vbCritical, "AVISO"
Me!txtPassword = vbNullString
Me!txtPassword.SetFocus
Exit Sub
End If
' Si estamos aquí es porque el password es correcto. Asignamos el valor del combo a la variable publica:
intActiveUser = Me!cboUsuario.Value
End Sub
Bien, ya tenemos como validar la contraseña y establecer el valor de la variable.
Veamos ahora como establecer los permisos al entrar en un formulario. En el mismo módulo dónde hemos declarado la variable, vamos a meter la función que te indicaba. Se supone que tienes las tablas de privilegios y objetos tal como ya te había comentado.
Public Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "tblObjetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox"El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
Esa función devuelve True si el usuario tiene el privilegio de ver esos datos o false si no los tiene.
Se trata de evaluar ese resultado en el evento Open de cada formulario para saber si el usuario tiene acceso o no.
Y... ya está.
He repasado todos mis mensajes en este hilo y no veo que ahora haya dicho nada distinto a lo dicho anteriormente...
Ya lo tengo casi casi.
Ya me compara la password y me dice si es erróneo. Pero como puedo decirle en ese mismo código del botón, ¿qué si es verdadero en nombre de usuario y password me abra un formulario donde tengo una lista de todos los formularios llamado panel de inicio?
A parte de esto, cuando meto la password correcta y doy al botón, no me da error pero no hace nada, si le doy a cerrar el formulario y me voy al formulario productos donde he puesto el privilegio me da un error, te digo cual es:
Error de compilación se ha detectado un nombre ambiguo: Ver Acceso
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
Ya me compara la password y me dice si es erróneo. Pero como puedo decirle en ese mismo código del botón, ¿qué si es verdadero en nombre de usuario y password me abra un formulario donde tengo una lista de todos los formularios llamado panel de inicio?
A parte de esto, cuando meto la password correcta y doy al botón, no me da error pero no hace nada, si le doy a cerrar el formulario y me voy al formulario productos donde he puesto el privilegio me da un error, te digo cual es:
Error de compilación se ha detectado un nombre ambiguo: Ver Acceso
Private Sub Form_Open(Cancel As Integer)
If VerAcceso(Me) = False Then
MsgBox "No dispones de los privilegios necesarios para ver la información.", vbCritical, "AVISO"
Cancel = True
End If
End Sub
Me sorprende tu primera pregunta. ¿No sabes como se abre un formulario?
DoCmd. OpenForm "panel de inicio"
En cuanto al error... pues está bien claro; tienes 2 funciones en tu base de datos con el mismo nombre: VerAcceso. Revísalo.
DoCmd. OpenForm "panel de inicio"
En cuanto al error... pues está bien claro; tienes 2 funciones en tu base de datos con el mismo nombre: VerAcceso. Revísalo.
Si es que tenía un nombre igual de otra función.
Pero ahora cuando abro el formulario productos me da el siguiente error:
Se ha producido el error 13 en tiempo de ejecución. No coinciden los tipos.
Y le doy a depurar y me va a la línea:
Public Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "Objetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox "El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
Pero ahora cuando abro el formulario productos me da el siguiente error:
Se ha producido el error 13 en tiempo de ejecución. No coinciden los tipos.
Y le doy a depurar y me va a la línea:
Public Function VerAcceso(frmAccess As Form) As Boolean
' buscamos el privilegio asociado al formulario, evaluando el nulo
Dim intPrivilegio As Integer
intPrivilegio = Nz(DLookup("IdPrivilegio", "Objetos", "NombreFormulario = '" & frmAccess.Name & "'"), 0)
If intPrivilegio = 0 Then
' Ahora decides si quieres permitir el acceso o no al formulario. Es posible que te hayas olvidado de definir el privilegio para el objeto y, incluso, puedes tratar la ausencia de privilegio como un acceso universal. Te toca decidir que táctica aplicar para decidir el valor que devuelves. Imaginemos que utilizamos seguridad 'pesimista': no hay privilegio para el objeto... pues no accedes, por si las moscas.
MsgBox "El formulario no tiene privilegios asignados. No puedes ver la información. Consulta al administrador", vbInformation, "AVISO"
VerAcceso = False
Exit Function
End If
' Bien. Si estamos aquí es porque el objeto tiene algún privilegio. Veamos si el usuario actual tiene ese privilegio:
If DCount("*", "PrivilegiosEmpleados", "IdUsuario=" & intActiveUser & " AND IdPrivilegio = " & intPrivilegio) > 0 Then
' existe una combinación de usuario y privilegio: el usuario puede entrar.
VerAcceso = True
Else
' no existe esa combinacion
VerAcceso = False
End If
End Function
He conseguido que funcione, el logueo de usuarios y los permisos en el formulario productos.
Era porque el idprivilegio de la tabla objetos y privilegios de usuario tienen que ser formato numéricos.
Pero tengo un problema, si en el formulario de entrada de usuarios, pongo sólo el usuario (sin rellenar el campo password) me pasa al siguiente formulario y me deja entrar.
Como puedo hacer para poner obligatorio el textobox de la contraseña, para que no pasen a otro formulario sin rellenarlo.
De todas formas muchísimas gracias por todo, has sido muy amable y me has ayudado muchísimo en todo. Ya con esto me quedo contentísimo, te lo agradezco mucho de verdad, con gente como tu da gusto.
Un saludo.
Era porque el idprivilegio de la tabla objetos y privilegios de usuario tienen que ser formato numéricos.
Pero tengo un problema, si en el formulario de entrada de usuarios, pongo sólo el usuario (sin rellenar el campo password) me pasa al siguiente formulario y me deja entrar.
Como puedo hacer para poner obligatorio el textobox de la contraseña, para que no pasen a otro formulario sin rellenarlo.
De todas formas muchísimas gracias por todo, has sido muy amable y me has ayudado muchísimo en todo. Ya con esto me quedo contentísimo, te lo agradezco mucho de verdad, con gente como tu da gusto.
Un saludo.
Algunos mensajes de error de Access pueden ser confusos, escuetos o ambiguos. Esta precisamente NO es uno de ellos.
Cuando dice que no coinciden los tipos es porque estas intentando hacer una asignación o comprobación de valores entre campos/variables que no son del mismo tipo.
Me temo que el campo idprivilegio de la tabla de objetos NO es un numérico.
Cuando dice que no coinciden los tipos es porque estas intentando hacer una asignación o comprobación de valores entre campos/variables que no son del mismo tipo.
Me temo que el campo idprivilegio de la tabla de objetos NO es un numérico.
Pero tengo un problema, si en el formulario de entrada de usuarios, pongo sólo el usuario (sin rellenar el campo password) me pasa al siguiente formulario y me deja entrar.
Como puedo hacer para poner obligatorio el textobox de la contraseña, para que no pasen a otro formulario sin rellenarlo
Como puedo hacer para poner obligatorio el textobox de la contraseña, para que no pasen a otro formulario sin rellenarlo
Si has puesto el código tal como te lo he indicado, no debería suceder. Lo que pasa es que no se en que punto del código has puesto la apertura del siguiente código.
Una forma de evitar que puedan clicar en el botón es deshabilitarlo cuando no estén rellenos los dos campos y habilitarlo cuando lo están. Sigue paso a paso estas instrucciones.
Deshabilita el botón de comando. Propiedad Activado a No
Escribe esta función en el módulo del formulario de login.
Private Function ActivaBoton()
If Me!cboUsuario <> 0 And Me!txtPassword <> "" Then
Me!cmdLogin = True
Else
Me!cmdLogin = False
End If
End Function
En el evento Después de actualizar tanto del combo como del textbox, y directamente en la hoja de propiedades, escribes:
=ActivaBoton()
Una forma de evitar que puedan clicar en el botón es deshabilitarlo cuando no estén rellenos los dos campos y habilitarlo cuando lo están. Sigue paso a paso estas instrucciones.
Deshabilita el botón de comando. Propiedad Activado a No
Escribe esta función en el módulo del formulario de login.
Private Function ActivaBoton()
If Me!cboUsuario <> 0 And Me!txtPassword <> "" Then
Me!cmdLogin = True
Else
Me!cmdLogin = False
End If
End Function
En el evento Después de actualizar tanto del combo como del textbox, y directamente en la hoja de propiedades, escribes:
=ActivaBoton()
Me da un error cuando pongo =ActivaBoton, cuando elijo un nombre del combobox me da el siguiente error:
La expresión 'después de actualizar' que ha especificado como valor de la propiedad del evento produjo el error el objeto no admite esta propiedad o evento.
La expresión 'después de actualizar' que ha especificado como valor de la propiedad del evento produjo el error el objeto no admite esta propiedad o evento.
Me aparece esta aclaración:
Este error se produce cuando un evento no se ha podido ejecutar debido a que Microsoft Office Access no puede evaluar la ubicación de la lógica del evento. Por ejemplo, si la propiedad OnOpen de un formulario se establece en =[Field], este error se produce porque Access espera que se ejecute un nombre de macro o evento al desencadenarse el evento.
¿A qué se debe esto? Si lo he puesto como me has dicho.
Este error se produce cuando un evento no se ha podido ejecutar debido a que Microsoft Office Access no puede evaluar la ubicación de la lógica del evento. Por ejemplo, si la propiedad OnOpen de un formulario se establece en =[Field], este error se produce porque Access espera que se ejecute un nombre de macro o evento al desencadenarse el evento.
¿A qué se debe esto? Si lo he puesto como me has dicho.
El código de la función, ¿está en el el módulo asociado al formulario?
Y la llamada a la función, ¿la pusiste directamente en la hoja de propiedades o en el editor de VBA?
Y la llamada a la función, ¿la pusiste directamente en la hoja de propiedades o en el editor de VBA?
El código de la función la he puesto, en el código donde esta el código del botón, y la llamada directamente en las propiedades.
Buenos días.
No sabes que es lo que puede fallar no, yo he revisado todo y esta todo como me has dicho, pero parece que no acepta la función el después de actualizar del combo y el textbox.
Esto sería ya lo último que me quedaría para terminar, por favor.
Muchas gracias.
Un saludo.
No sabes que es lo que puede fallar no, yo he revisado todo y esta todo como me has dicho, pero parece que no acepta la función el después de actualizar del combo y el textbox.
Esto sería ya lo último que me quedaría para terminar, por favor.
Muchas gracias.
Un saludo.
Para acabar ya con este post que se esta haciendo demasiado largo...
Mandame la bdd (con lo justo y necesario) comprimida en un zip, rar o 7z a [email protected]
Mandame la bdd (con lo justo y necesario) comprimida en un zip, rar o 7z a [email protected]
Vale, error mio.
Private Function ActivaBoton()
If Me!cboUsuario <> 0 And Me!txtPassword <> "" Then
Me!cmdLogin.Enabled = True
Else
Me!cmdLogin.Enabled = False
End If
End Function
Aunque te voy a dar un consejo: si vas a dedicarte a programar, eso deberías haberlo visto tu sólito. Ten en cuenta que yo te escribo el código, pero tu debes verificarlo. Yo lo escribo directamente aquí, no hago pruebas previas.
Private Function ActivaBoton()
If Me!cboUsuario <> 0 And Me!txtPassword <> "" Then
Me!cmdLogin.Enabled = True
Else
Me!cmdLogin.Enabled = False
End If
End Function
Aunque te voy a dar un consejo: si vas a dedicarte a programar, eso deberías haberlo visto tu sólito. Ten en cuenta que yo te escribo el código, pero tu debes verificarlo. Yo lo escribo directamente aquí, no hago pruebas previas.
- Compartir respuesta
- Anónimo
ahora mismo