No cabe duda que uno de los productos más usados es la suite de Microsoft Office, varias de sus aplicaciones tales como Word, Excel, Powerpoint, Access llevan bastante tiempo con nosotros. Aún existiendo alternativas gratuitas, son aplicaciones que consolidaron el éxito de Microsoft y se han convertido en herramientas extendidas y muy empleadas tanto en entornos profesionales como del hogar.
Una de ellas, quizás la menos empleada de las anteriores mencionadas, posee grandes características para poder crear desarrollos para pequeñas y medianas necesidades.
En esta entrada voy a escribir sobre la seguridad en Microsoft Access, cómo ha evolucionado y lo que podemos hacer con este gestor. También os dejaré un proyecto que he realizado para que podáis analizar cómo implementar una seguridad por usuarios basada en niveles y apoyada en dos bases de datos accdb (protegida con contraseña, con formularios de gestión de usuarios), válidas a partir de la versión 2007. También en el ejemplo, os muestro técnicas de uso con formularios, para crear interfaces de usuario, consultas paramétricas y ejemplos funcionales de recolección y tratamiento de datos y encuestas, que os pueden dar una idea de sus posibles utilidades en otro tipo de ámbitos.
Si bien es cierto que Access NO es un gestor relacional considerado puro, que sus características y seguridad no son tan profesionales como otros productos más sólidos (SQL Server, Oracle, Mysql…), nos puede proporcionar un entorno para crear aplicaciones de escritorio y para trabajo en red bastante funcional y específico. Necesidades específicas que otros programas ERP, CRM, etc no son capaces de recoger sin una costosa modificación o parametrización. Podríamos dar solución a necesidades empresariales(PYMES) y particulares especificas que de otra forma serían más costosas por sus modificaciones tanto a nivel presupuestario como técnico.
Sobre el ejemplo
¿Qué paso en la seguridad de usuarios a partir de la versión 2007?
Las Características de seguridad por usuarios ya no están disponibles en aplicaciones web de Access, bases de datos web o bases de datos que usan uno de los nuevos formatos de archivo (.accdb, .accde, .accdc, .accdr). La base de datos que os suministro posee un formato moderno accdb. Tampoco existen como tal los proyectos ADP, que en ocasiones se usaron para conectar con gestores SQL Server.
Desde la versión 2007 se puede continuar administrando la seguridad en los archivos de base de datos de escritorio de Access que usan un formato de archivo anterior de Access ( .mdb o ADE).
Por lo que esta técnica que os comento, os puede resultar muy interesante, ya que no existe otra en local para nuevos formatos. Podríamos emplear seguridad basada en Sharepoint y Access, o emplear otro gestor de apoyo como SQL Server, pero requiere de servidores externos.
El ejemplo suministrado esta formado por 2 bases de datos. Una de ellas posee una password y almacena los usuarios y sus accesos, también se establecen diversos niveles de acceso, siendo el nivel 2 el empleado por el administrador. Para poder gestionar los usuarios con los formularios creados, es necesario abrir la base de datos usando la contraseña demo. Posee un control de validación y log de entrada a modo de tabla.
Os he dejado el formato con el código abierto accdb, os recuerdo que el código se encuentra disponible, podríais establecer una password en el código desde el editor de código que incorpora Access, o compilar la base de datos a un formato accde, para que no se viera el código, de tal forma que una vez que se han programado los formularios en los eventos de carga, comprobar su nivel y cargar o mostrar elementos en función del nivel de seguridad establecido.
El proyecto que os dejo, también muestra como desactivar ventanas para que luzca con una interfaz profesional, desactivar teclas f12 que muestran objetos, carga de formularios, uso de calendario alternativo y el código de como atacar mediante programación a una base de datos de Access diferente, de forma siempre relativa. Este código lo subiré para que se pueda hacer lo mismo desde una hoja de cálculo Excel (xlsx), que lea datos de una base Access, sin emplear DSN mediante cadena de conexión. Simplemente es necesario tener presente las referencias a objetos ADO.
También os muestro cómo cargar Access sin mostrar su logo (personalizando el de la empresa), o como se pueden leer imágenes desde el exterior (carpeta imágenes necesaria). Las ayudas son todas dinámicas apoyadas en tablas, para poder cambiarlas sin tocar código. Recordad que yo simplemente he establecido datos de la tabla usuarios de la otra base, pueden depositarse mas tablas si así fuera necesario.
Seguridad alternativa
Los mejores consejos para aplicar seguridad alternativa, es cifrar la base de datos o emplear un servidor de bases de datos externo que administre datos y usuarios pero bajo el paraguas del gestor como SQL Server.
Seguridad de usuarios proporcionada por Sharepoint Server, que posibilitan incluso el trabajo sin conexión.
O finalizar con aplicaciones de Access que se ejecuten el en explorador web, usando la seguridad a nivel de servidor.
Archivos del fichero RAR
Recuerda… posee una password: demo, para acceder a la base de datos tienes que disponder como mínimo de Access 2007 y una estructura de archivos que dejo dentro del rar.
El fichero rar contiene 2 bases de datos, la base de datos usuarios requiere una contraseña para acceder (demo). La demo de formularios y todo el código se encuentra disponible en demo.accdb.
Es necesario dejar la carpeta imágenes al lado de las bases.
Demo de código ACCDB
Recuerda que puedes compilar la base de datos en formato accde para nadie pueda ver el código de seguridad por niveles.
Validamos si existe el usuario en la base de datos 'Procedimiento acceso a la base de datos con contraseña Set cnn = New ADODB.Connection ruta_base = Left(CStr(Application.CurrentDb.Name), Len(CStr(Application.CurrentDb.Name)) - 11) + "\usuarios.accdb" 'ruta = Left(CStr(Application.CurrentDb.Name), Len(CStr(Application.CurrentDb.Name)) - 23) + "\logo.jpg" cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _ "Data Source=" & ruta_base & ";" & _ "Jet OLEDB:Database Password=demo" Set registro = New ADODB.Recordset Set registro_log = New ADODB.Recordset cSQL = "select count(*) as cuenta from usuarios where login ='" & LCase(login) & "' and password = '" & LCase(password) & "';" registro.Open cSQL, cnn, adOpenDynamic, adLockOptimistic registro_log.CursorType = adOpenOptimistic registro_log.LockType = adLockOptimistic registro_log.Open "log", cnn 'Nos preparamos para la gestión del log registro_log.AddNew registro_log!Fecha = Date registro_log!hora = Time usuario = login registro_log!login = login registro_log!password = password If registro!cuenta = 0 Then estado.Caption = "Acceso no válido, compruebe sus credenciales. " registro_log!fallido = "SI" registro_log.Update registro_log.Close registro.Close cnn.Close Else 'Mostramos la barra de menus si se poseen los permisos adecuados registro_log!fallido = "NO" registro_log.Update registro_log.Close registro.Close 'Establecemos las variables globales Global_usuario = LCase(usuario) Global_Password = LCase(password) Set registro = New ADODB.Recordset cSQL = "select nivel from usuarios where login ='" & LCase(login) & "' and password = '" & LCase(password) & "';" registro.Open cSQL, cnn, adOpenDynamic, adLockOptimistic 'Se establece el nivel de acceso a la entrada Global_nivel = registro!Nivel registro.Close cnn.Close DoCmd.Close DoCmd.OpenForm "principal" Form_principal.usuario.Caption = usuario & " , nivel " & Global_nivel End If