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?

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top