example hibernate jboss db2 data-access

example - hibernate dialect sql server



Cómo limitar el acceso de los usuarios a nivel de base de datos en Hibernate (3)

  1. Agregue una clave de seguridad a sus entidades, cree una tabla de permisos y enlace al usuario con permiso con entitytype y también con la clave de seguridad con la función. De esta forma, puede decir cosas como: Admin_role puede acceder al Estudiante (tipo de entidad) y leer (Operación en Permiso) y Escribir (Operación) mientras Student_role puede acceder a la clave del Estudiante para él y Read_permission. Puede corregir la dirección refaccionando eso en una entidad y agregándole una clave de seguridad.

    1. Su número cuatro podría tener una suposición de mundo cerrado y decir que a menos que pueda para el rol actual del usuario, vincule el nombre de la propiedad con un indicador en un diccionario (entidad + propiedad) -hash para señalar, la suposición del mundo cerrada siendo que las lecturas no están permitidas por defecto. Entonces, por supuesto, no obtiene ningún permiso de escritura, etc.

    2. Puede definir vistas en su base de datos y asignarles derechos utilizando el sistema de autenticación de la base de datos. Esta es probablemente la forma más limpia si puede codificarse usted mismo, la forma de seleccionar a qué vista llamar según el rol que desempeñemos. (Mi antiguo profesor de RDBMS me amaría por decir esto;)) Esto también se aleja un poco de Hibernate y combina tus cosas más en la base de datos. Depende de cuán móvil / portátil sea su código, supongo.

    3. Use un aspecto alrededor de su dao genérico (IRepository) que reescribe las consultas según sus permisos; esto implica que tiene la seguridad basada en permisos en el código, por supuesto.

El botón de edición que se esconde en la interfaz gráfica de usuario realmente solo se puede hacer si primero transfieres los permisos al código, como en mi punto 1. Te sugiero que eches un vistazo al blog de Ayendes para una implementación de código abierto de esto, él es un experto descifrador.

La aplicación

Necesito implementar una aplicación web que será utilizada por diferentes usuarios. Cada usuario tiene diferentes privilegios en varias tablas, por ejemplo

  • El usuario A puede ver los campos ''nombre'' y ''dirección'' de la tabla Student
  • El usuario B puede ver los campos ''nombre'' y ''número de teléfono'', pero no ''dirección'' de la tabla Student
  • El usuario C puede ver y modificar todos los campos mencionados anteriormente

  • Tendré algo en el nivel de UI para limitar cierto acceso, por ejemplo, ocultar el botón "editar" para usuarios que no tienen permiso para modificar entradas. Sin embargo, creo que debería tener algo en un nivel inferior (¿quizás a nivel de base de datos?) Solo para garantizar la seguridad de los datos.

    El problema

    Estoy usando Hibernate, JBoss, DB2 y Struts para mi aplicación. Creo que debería usar un JBoss LoginModule de algún tipo, que autentica al usuario contra una base de datos con usuario / contraseña / roles (pero puedo estar equivocado (?)). Hice algunas investigaciones y se me ocurrieron las siguientes opciones, pero ninguna parece ajustarse a mi caso. Creo que este es un problema de acceso a datos muy común en aplicaciones web multiusuario. ¿Podría alguien señalarme en la dirección correcta? ¡Gracias de antemano!

    1. Use la etiqueta ''grant'' en hibernate.cfg.xml con los detectores de eventos JACC. Esto puede establecer permisos de "lectura" de "actualización" para "insertar" en todas las entidades de hibernación. Sin embargo, ¿y si necesito controles más finos? Necesito establecer permisos en ciertos campos en lugar de todo el objeto. http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-decl-security.html

    2. Limite los permisos en el método getter / setter de cada ejb. Si entendí esto correctamente, esto requiere la configuración manual de cada grano por cada perfil de usuario, lo que me parece poco realista. Permisos del método EJB

    3. Codifique los DAO para verificar los permisos del usuario. Rollo mi propia función de utilidad que comprueba una tabla de permisos gigante cada vez que se llama a un método DAO particular para determinar si el usuario conectado puede realizar la acción o no.

    4. Use ''interceptor'' y ''eventos'' en Hibernate. Defina los eventos e interceptores específicos de "onLoad", "onSaveorUpdate" para cada clase. ¿Puedo especificar el nivel de permiso para campos individuales en este caso? http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-events.html

    Podría estar ladrando en el árbol equivocado. Todo lo anterior parece ser laborioso y no muy inteligente. Ninguna de las opciones anteriores me brinda formas programáticas para cambiar los permisos de los usuarios en el tiempo de ejecución, lo que sería útil cuando un usuario de nivel de administrador desea darle a otro usuario más control en esta aplicación.


    ¿Cuál es una buena forma de hacer control de acceso a datos aquí?


    Otra opción podría ser usar tipos personalizados. Por ejemplo, en lugar de asignar un carácter a una Cadena, asigne un tipo personalizado como SecureString. Dale un parámetro con algún tipo de identificador único en la asignación, por ejemplo, table.column. Luego, en el método nullSafeGet del tipo personalizado, puede llamar a un servicio de seguridad para ver si completa el valor o simplemente lo establece en nulo. También debería usar un ThreadLocal para almacenar algo para identificar al usuario o rol. Solo tendrías que crear un puñado de tipos personalizados para ajustar la cadena, el doble, la fecha, el entero, etc. He hecho algo similar para permitir que las fechas se conviertan al huso horario del usuario.


    Me gusta la sugerencia de Henrik de usar vistas.

    Los filtros de Hibernate pueden funcionar, pero creo que son más para filtrar filas en lugar de columnas.

    También puede usar [Modelos dinámicos basados ​​en mapas] (http://www.hibernate.org/hib_docs/reference/en/html/persistent-classes-dynamicmodels.html) junto con [consultas nombradas] por separado (http: // www.hibernate.org/hib_docs/reference/en/html/querysql-namedqueries.html), en lugar de tener frijoles parcialmente llenos. Entonces su código de vista simplemente verificará si el mapa contiene una entrada para `dirección`, y mostrará el campo si se encuentra?