Frage

Ich bin mit Java - Ibatis und mySQL mit Flex / Flash auf dem Front-End. Ich habe eine Anforderung, die dynamisch in der Lage ist zu creterias und Tabelle zu einer Abfrage hinzufügen auf der Benutzerrolle abhängig. hier ist ein Beispiel

Das gleiche Objekt aufrufen gleiche SQL aber anderes Ergebnis basiert auf Rolle

Rolle 1: Vollständig Zugriff auf Mitarbeiter

SELECT * 
  FROM Employee A

Die Rolle 2: Limited Zugriff auf Mitarbeiter

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

Ich konnte verwenden dynamische SQL

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

Andere Ideen?

War es hilfreich?

Lösung

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>

Ein wenig einfacher als DAOs zu schaffen, aber immer noch Sie die Flexibilität, andere hinzuzufügen beitritt oder andere Klausel where Elemente ohne Rolle in jeder Parameterkarte enthalten, die

Andere Tipps

Das Problem mit in der Abfrage mit Rolle ist, dass Sie müssen dann als Argument für die Abfrage liefern für möglicherweise jede Abfrage. Was passiert, wenn Sie Argumente für die Abfrage benötigen liefern? Sie werden Rolle dieser Parameter Klassen hinzufügen müssen / zu abbildet. Es ist alles ein bisschen chaotisch.

ich einen Schritt zurück nehmen würde und Ihre DAO definieren:

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

und erstellen Sie dann zwei Implementierungen:

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

Ein Vorteil dieses Ansatzes besteht darin, dass, wenn bestimmte Methoden nicht durch eine besondere Rolle verwendet werden, sollten Sie die Möglichkeit, wirft einige Sicherheitsverletzung Ausnahme haben.

Nun, wie Sie stecken, dass in den Rest der Anwendung ist etwas, das ich nicht genug Detail zu kommentieren. Sie könnten BlazeDS in diesem Fall verwenden würde ich vorschlagen mit der Frühling Integration mit BlazeDS , die wird Dependency Injection als Option öffnen.

Alternativ können Sie eine einfache Factory-Methode verwenden (basierend auf Rolle), um die richtige DAO zu erhalten.

Es gibt keine Zweifel, andere Möglichkeiten, dies zu stecken auf Ihrer Konfiguration in Abhängigkeit. Ich denke, die über viel sauberer als das, was Sie vorschlagen though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top