Pregunta

Estoy usando Java - Ibatis y mySQL con Flex / Flash en el front-end. Tengo un requisito que es poder agregar dinámicamente creterias y tablas a una consulta dependiendo de la función del usuario. aquí hay un ejemplo

Mismo objeto que llama al mismo SQL pero diferente resultado según el rol

Rol 1: Acceso total a los empleados

SELECT * 
  FROM Employee A

Rol 2: Acceso limitado a los empleados

SELECT * 
 FROM Employee A
    , SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
  AND B.ROLE_ID = 'ROLE'

Podría usar SQL dinámico

    SELECT * 
     FROM Employee A
<isNotEmpty property="ROLE" >
        , SECURE_LIST B
    WHERE B.EmployeeID = A.EmployeeID
      AND B.ROLE_ID = #ROLE#
</isNotEmpty>

¿Otras ideas?

¿Fue útil?

Solución

SELECT *      
FROM Employee A
<isNotEmpty property="ROLE" >
   inner join SECURE_LIST B on B.EmployeeID = A.EmployeeID
</isNotEmpty>
<dynamic prepend="WHERE">
      <isNotEmpty property="ROLE" prepend="AND">
           B.ROLE_ID = #ROLE#
      </isNotEmpty>
</dynamic>

Un poco más simple que crear DAO, pero aún así le brinda la flexibilidad de agregar otras uniones u otros elementos de cláusula where sin tener que incluir un rol en cada mapa de parámetros

Otros consejos

El problema con el uso del rol dentro de la consulta es que debe proporcionarlo como argumento para la consulta para posiblemente cada consulta. ¿Qué sucede cuando necesita proporcionar argumentos a la consulta? Deberá agregar un rol a esas clases / mapas de parámetros también. Todo es un poco desordenado.

Daría un paso atrás y definiría tu DAO:

public interface MyDAO {
  List<Employee> getEmployees();
  ...
}

y luego crea dos implementaciones:

public class MyDAOSuper implements MyDAO {
  public List<Employee> getEmployees() {
    // call a query using your first SQL
  }
}

public class MyDAOLimited implements MyDAO {
  public List<Employee> getEmployees() {
    // limited version
  }
}

Una ventaja de este enfoque es que si ciertos métodos no deben ser utilizados por un rol en particular, tiene la opción de lanzar alguna excepción de violación de seguridad.

Ahora, cómo enchufarlo al resto de su aplicación es algo de lo que no tengo suficientes detalles para comentar. Es posible que esté utilizando BlazeDS, en cuyo caso sugeriría usar Integración de Spring con BlazeDS , que abrirá la inyección de dependencia como una opción.

Alternativamente, podría usar un método de fábrica simple (basado en el rol) para obtener el DAO correcto.

No hay duda de que hay otras formas de conectar esto dependiendo de su configuración. Sin embargo, creo que lo anterior es mucho más limpio de lo que estás proponiendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top