2009-01-20 11 views
1

J'utilise Java - Ibatis et mySQL avec Flex/Flash sur le front-end. J'ai une exigence qui est d'être en mesure d'ajouter dynamiquement creterias et la table à une requête en fonction du rôle de l'utilisateur. voici un exempleJava - Ibatis - mySQL avec requête dynamique basée sur le rôle

objet même d'appeler même SQL mais des résultats différents en fonction du rôle

Rôle 1: Entièrement d'accès aux employés

SELECT * 
    FROM Employee A 

Rôle 2: L'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 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?

Répondre

2
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 OTI, mais en vous offrant la possibilité d'ajouter d'autres jointures ou d'autres où les éléments de la clause sans avoir à inclure rôle dans toutes les cartes des paramètres

0

Le problème avec l'utilisation du 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/cartes de paramètres. Tout est un peu brouillon.

Je prendrais un pas en arrière et définir 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 
    } 
} 

Un avantage de cette approche est que si certaines méthodes ne doivent pas être Utilisé par un rôle particulier, vous avez la possibilité de lancer une exception de violation de sécurité.

Maintenant comment vous branchez cela dans le reste de votre application est quelque chose que je n'ai pas assez de détails pour commenter. Vous pouvez utiliser BlazeDS, auquel cas je suggère d'utiliser le Spring integration with BlazeDS, qui ouvrira l'injection de dépendance en option.

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

Il existe sans aucun doute d'autres façons de brancher ceci en fonction de votre configuration. Je pense que ce qui précède est beaucoup plus propre que ce que vous proposez.

+0

J'aime l'idée, et oui je fais usage L'intégration de Spring avec BlazeDS ... –

+0

Le seul problème que j'ai avec ceci est que la plupart des DAO sont soumis à cette sous-requête Secure List donc je vais devoir créer 2 DAO pour la plupart de mes objets, un SUPER un Limited, qui semble être beaucoup de code ... des pensées? –