Java - Ibatis - mySQL con query dinamica basata sul ruolo
-
19-08-2019 - |
Domanda
Sto usando Java - Ibatis e mySQL con Flex / Flash sul front-end. Ho un requisito che è quello di essere in grado di aggiungere dinamicamente creterias e tabella a una query a seconda del ruolo dell'utente. ecco un esempio
Stesso oggetto che chiama lo stesso SQL ma risultati diversi in base al ruolo
Ruolo 1: accesso completo ai dipendenti
SELECT *
FROM Employee A
Ruolo 2: accesso limitato ai dipendenti
SELECT *
FROM Employee A
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = 'ROLE'
Potrei usare Dynamic SQL
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = #ROLE#
</isNotEmpty>
Altre idee?
Soluzione
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 po 'più semplice rispetto alla creazione di DAO ma ti offre comunque la flessibilità di aggiungere altri join o altri elementi della clausola where senza dover includere il ruolo in ogni mappa dei parametri
Altri suggerimenti
Il problema con l'utilizzo del ruolo all'interno della query è che è necessario fornirlo come argomento alla query per ogni possibile query. Cosa succede quando è necessario fornire argomenti alla query? Dovrai aggiungere un ruolo anche a quelle classi / mappe di parametri. È tutto un po 'disordinato.
Vorrei fare un passo indietro e definirei il tuo DAO:
public interface MyDAO {
List<Employee> getEmployees();
...
}
e quindi creare due implementazioni:
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
}
}
Un vantaggio di questo approccio è che se alcuni metodi non devono essere utilizzati da un ruolo particolare, hai la possibilità di lanciare qualche eccezione di violazione della sicurezza.
Ora come lo colleghi al resto della tua applicazione è qualcosa che non ho abbastanza dettagli per commentare. Potresti utilizzare BlazeDS, nel qual caso ti suggerirei di utilizzare Integrazione primaverile con BlazeDS , che aprirà l'iniezione di dipendenza come opzione.
In alternativa puoi usare un semplice metodo factory (basato sul ruolo) per ottenere il DAO corretto.
Non ci sono altri modi per collegarlo a seconda della configurazione. Penso che quanto sopra sia molto più pulito di quello che stai proponendo però.