Question

J'utilise Java - Ibatis et MySQL avec Flex / Flash sur le front-end. J'ai une exigence qui consiste à pouvoir ajouter dynamiquement des crétérias et des tables à une requête en fonction du rôle de l'utilisateur. voici un exemple

Même objet appelant le même SQL mais résultat différent en fonction du rôle

Rôle 1: accès total aux employés

SELECT * 
  FROM Employee A

Rôle 2: accès limité aux employés

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

Je pourrais utiliser le SQL dynamique

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

D'autres idées?

Était-ce utile?

La solution

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 peu plus simple que de créer des DAO tout en vous offrant la possibilité d'ajouter d'autres jointures ou d'autres éléments de clause where sans avoir à inclure de rôle dans chaque mappage de paramètres

Autres conseils

Le problème avec l'utilisation de rôle dans la requête est que vous devez ensuite le fournir en tant qu'argument à la requête pour éventuellement chaque requête. Que se passe-t-il lorsque vous devez fournir des arguments à la requête? Vous devrez également ajouter un rôle à ces classes de paramètres / cartes. Tout est un peu brouillon.

Je prendrais un peu de recul et définirais votre DAO:

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

puis créez deux implémentations:

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
  }
}

L'un des avantages de cette approche est que si certaines méthodes ne doivent pas être utilisées par un rôle particulier, vous avez la possibilité de générer une exception de violation de la sécurité.

Maintenant, la façon dont vous intégrez cette information au reste de votre application est une chose sur laquelle je n'ai pas assez de détails pour faire des commentaires. Vous utilisez peut-être BlazeDS, auquel cas je suggérerais d'utiliser la Intégration de printemps avec BlazeDS , qui ouvrira l’injection de dépendance en option.

Vous pouvez également utiliser une méthode fabrique simple (basée sur le rôle) pour obtenir le DAO correct.

Il existe sans doute d'autres moyens de le brancher en fonction de votre configuration. Je pense que ce qui précède est beaucoup plus propre que ce que vous proposez cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top