Validacion java --> mysql
Hola que tal?
Bueno, este es mi primer post y la verdad no sabia donde ubicarlo puesto a que no encontre una categoria para esto.
Para empezar, estoy desarrollando un proyectico por medio del cual estoy aplicando muchos de los conocimientos que he aprendido en la U y en el internet, ademas estoy tratando de aprender muchas otras cosas importantes para el manejo de un sistema ( desde su eficiencia,su seguridad,su portabilidad, entre muchas otras cosas).
El proyecto trata sobre, el manejo de inventario,facturacion,cuentas por pagar y por cobrar, para esto estoy trabajando con java y mysql.
Ya estoy un poco avanzado en cuanto al diseno de la base de datos, pero me he topado con unos problemas que quisiera solucionar de la mejor manera para
conseguir un buen producto.
Quisiera que se hiciera una optima validacion de usuarios y que no comprometa la integridad de la base de datos, para esto tengo que tener en cuenta como hacer las conexiones.
He investigado sobre como hacer conexiones a la base de datos, pero al parecer no es de la mejor manera ya que, ademas de ser insegura, puede ser un poco lenta en cuanto a concurrencia.
Mi idea seria, tener una ventana login (con nickname y password ) al hacer click en el boton entrar, se hiciera una conexion a la base de datos ( de la mejor manera, no se cual seria) y se revisara una tabla usuarios hecha por mi para hacer luego una comparacion con los datos registrados y permitiera el ingreso a la aplicacion (claro, dependeria del nivel del usuario, ejemplo: Si es el administrador del negocio, si es el jefe de inventario, si es un vendedor) y luego cerrar la conexion ( La cantidad de usuarios conectados simultaneamente podrian ser maximo 20). Luego, para cada accion hecha por cada usuario en la aplicacion, se abriria una conexion, se haria una consulta, y luego se cerraria.
*No se si, es bueno mantener una conexion abierta durante toda la ejecucion el programa, o deberia ser como lo digo.
*No se si, es bueno manejar una independencia entre los usuarios de la aplicacion y los usuarios de la base de datos, es decir que, tenga por aparte en la tabla user de mysql unos usuarios con ciertos privilegios para luego asignarlos a los usuarios que yo cree aparte de acuerdo a sus roles en la empresa.
*No se si,seria bueno dejar la informacion de las conexiones (driver,url,user,password) en el codigo, ya que le permitira a otros programadores ver y encontrar cosas que no deberian estar a la vista de ninguna persona, por seguridad.
Espero haberme hecho entender, realmente quiero aprender las mejores practicas en cuestion de desarrollo de software.
He leido muchas cosas por internet (pools de conexiones,datasource,etc ) pero, realmente ando un poco enredado.
Ojala y me puedan guiar un poco, a ver si saco esto adelante.
Muchas gracias, y saludos desde Colombia!
PD: Se me olvidaba decir que esto seria cliente - servidor.
- Inicie sesión o regístrese para enviar comentarios
DB Auth
Si es cliente-servidor y el cliente es una aplicación de escritorio, yo te recomendaría que uses la autentificación de la base de datos, es decir manejes el esquema de usuarios en la base de datos, por las siguientes razones:
No te recomiendo dejar nada en código duro. El URL a la base de datos, así como el driver, deben ser configurables, por si luego cambia la IP del DBMS o utilizan un servidor distinto de MySQL. Y con lo anterior de manejar los usuarios de la base de datos, no necesitas almacenar usuario/password en la config de la app, sino que le vas a pedir al usuario que se autentifique primero ante la base de datos para darle ingreso.
En cuanto al manejo de la conexión una vez establecida, puede ser de las dos maneras, depende lo que quieras y la seguridad que desees manejar. Las ventajas/desventajas de cada esquema:
Dejar la conexión establecida
Abrir y cerrar conexiones conforme se necesiten
Mas dudas
Gracias por tu respuesta Ezamudio!
Bueno, por lo que veo, deberia darle un manejo mas simple a mi proyecto debido a la magnitud en cuanto a conexiones a la base de datos.
*Cuando dices que le deje la autenticacion a la base de datos, te refieres a que cree los usuarios sobre la tabla USER que trae por defecto la base de datos (en mi caso MYSQL) y que a estos les de ciertos permisos sobre ciertas tablas? con estos mismos se establezcan las conexiones?
*Que tal si alguno de estos usuarios tiene acceso directo a mysql, y mediante el command se conecte y haga modificaciones no deseadas?
*Si pienso manejar auditoria sobre mi sistema, me imagino que ademas de la tabla User (de mysql) debo tener otra tabla usuarios creada por mi, con los campos principales (username y password) para conocer quien hizo que, y sobre que. Y tambien me imagino que los valores de estas 2 tablas (user y usuarios) para los campos que son iguales deben aparecer registrados en las 2.
*Como puedo saber cuando la conexion permanece viva? y como se manejaria esto?
*Como haria para que el dbms solo me permita 20 conexiones?
Respuestas
Muchas preguntas. Algunas respuestas aquí:
*Cuando dices que le deje la autenticacion a la base de datos, te refieres a que cree los usuarios sobre la tabla USER que trae por defecto la base de datos (en mi caso MYSQL) y que a estos les de ciertos permisos sobre ciertas tablas? con estos mismos se establezcan las conexiones?
Me refiero a usar el esquema de autenticación de la base de datos. Crear usuarios que puedan tener acceso a la base de datos y en cada caso asignarle solamente los permisos que requiere para poder operar. Si MySQL utiliza una tabla llamada USER para la autenticación y control de acceso a sus bases de datos entonces sí, es esa. Tengo mucho tiempo de no usar MySQL y realmente nunca me metí a ver cómo es su esquema de autenticación de usuarios.
*Que tal si alguno de estos usuarios tiene acceso directo a mysql, y mediante el command se conecte y haga modificaciones no deseadas?
Cómo vas a evitar esto usando un solo usuario? Si el usuario que usan normalmente, lo usan para meterse usando una linea de comando de mysql o algun programa para ver esquemas y editar datos directamente, entonces podrán entrar a la base de datos, pero no podrán hacer ni deshacer más de lo que se le permita a su cuenta, porque se definieron permisos a nivel base de datos, sobre tablas, columnas, y las acciones que pueden realizar en ellas.
*Si pienso manejar auditoria sobre mi sistema, me imagino que ademas de la tabla User (de mysql) debo tener otra tabla usuarios creada por mi, con los campos principales (username y password) para conocer quien hizo que, y sobre que. Y tambien me imagino que los valores de estas 2 tablas (user y usuarios) para los campos que son iguales deben aparecer registrados en las 2.
No veo por qué debes tener otra tabla de usuarios. Si quieres saber quién hizo qué, entonces se debe guardar un log (en texto o en la base de datos) indicando las acciones realizadas por cada usuario, pero ya tienes una tabla USER con los usuarios registrados. No veo la razón para replicar esa tabla.
*Como puedo saber cuando la conexion permanece viva? y como se manejaria esto?
Una opción es con un timer que haga un query periódicamente, si la conexión no está en uso en ese momento. O tener algún tipo de objeto encima de la conexión o manejar un pool de conexiones a base de datos que se encarga de todo eso pero que tenga una sola conexión.
*Como haria para que el dbms solo me permita 20 conexiones?
Eso se configura en el RDBMS y depende de cada uno. Y como ya dije, hace mucho que no manejo mysql.
Mi idea era que, las cuentas
Mi idea era que, las cuentas de los usuarios finales fueran independientes de los usuarios de la base de datos.
Es decir, que no funcionaran los usernames y passwords de las personas que utilizaban la aplicacion para hacer conexiones y consultas a la base de datos sino que a estos se les aplicara algo asi como roles (activos o inactivos) dependieno del nivel del usuario.
Por eso decia, tener una tabla usuarios aparte de user.
En donde usuarios, pueda manejar por ejemplo los campos: username,password,nombre,apellido,telefono,identificaion,nivel, etc (ya que seria una cuenta para un empleado)
En la tabla USER crear unos usuarios por default donde: Existan algunos para hacer consultas tipo select , tipo update, tipo insert ,etc.
La validacion del login la haria de acuerdo a la tabla USUARIOS con una conexion predefinida (algo que no se como hacer), y luego de haberse conectado se le aplicarian o activarian los roles de acuerdo a su nivel.
La idea es tratar de que no exista ningun tipo de conexion directa de los usuarios con el sistema.
El problema es que no se como implementar bien esto, o si esto es una locura, no se.
No se puede
Si tu sistema es puramente una aplicación de escritorio conectada a una base de datos, y no quieres que se autentifiquen con el usuario de base de datos, entonces el username y password para la base de datos deberán estar en la configuración de la aplicación, junto con el URL y driver. Puedes tratar de cifrarlo de alguna forma pero tiene que ser encripción simétrica para que puedas leer los datos cifrados y obtener la info original para conectar la app al RDBMS, y entonces la llave debe estar guardada en la aplicación o en algún otro lugar en la computadora del usuario.
Esto ya se ha tratado de resolver por megacorporaciones como Apple y las disqueras, la RIAA, etc y no han podido, porque simplemente al usar encripción simétrica, la llave debe estar en algún lado accesible para la aplicación, y si es accesible a la aplicación es accesible para el usuario.
Tus alternativas son tratar de ocultar eso de alguna forma, o usar PKI o usar una arquitectura multicapa donde tienes la base de datos (DBMS) por una parte, un servidor de aplicaciones JEE que maneja las conexiones al DBMS y tiene un API que pueda ser invocado por RMI o web services, y la aplicación cliente, que se comunica únicamente con el servidor de aplicaciones.
UMMMM, Esto esta como que un
UMMMM, Esto esta como que un poco complicado jejeje.
Lastima que mis conocimientos son muy pocos referente a eso,creo que me va a tocar implementar algo sencillo por el momento y ponerme a estudiar mas a ver si consigo en el futuro algo mejor.
Muchas gracias por tu comprension y colaboracion!
Saludos.