Java-Ibatis-ロールに基づく動的クエリを使用したmySQL
-
19-08-2019 - |
質問
Javaを使用しています-フロントエンドでFlex / Flashを使用するIbatisとmySQL。ユーザーの役割に応じて、クエリに基準とテーブルを動的に追加できるという要件が1つあります。ここに例があります
同じSQLを呼び出している同じオブジェクトですが、ロールに基づいて結果が異なります
ロール1:従業員への完全なアクセス
SELECT *
FROM Employee A
役割2:従業員への制限付きアクセス
SELECT *
FROM Employee A
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = 'ROLE'
動的SQLを使用できます
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = #ROLE#
</isNotEmpty>
その他のアイデア?
解決
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>
DAOを作成するよりも少しシンプルですが、すべてのパラメーターマップにロールを含める必要なく、他の結合または他のwhere句要素を追加する柔軟性を提供します
他のヒント
クエリ内でロールを使用する場合の問題は、すべてのクエリに対してクエリへの引数としてロールを指定する必要があることです。クエリに引数を指定する必要がある場合はどうなりますか?これらのパラメータークラス/マップにもロールを追加する必要があります。少し面倒です。
後戻りしてDAOを定義します:
public interface MyDAO {
List<Employee> getEmployees();
...
}
次に2つの実装を作成します:
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
}
}
このアプローチの利点の1つは、特定のメソッドが特定のロールで使用されるべきではない場合、セキュリティ違反の例外をスローするオプションがあることです。
これをアプリケーションの残りの部分にどのように接続するかは、コメントするのに十分な詳細がありません。 BlazeDSを使用している場合は、 BlazeDSとのSpring統合を使用することをお勧めします。オプションとして依存性注入を開きます。
代わりに、単純なファクトリメソッド(ロールに基づく)を使用して、正しいDAOを取得できます。
設定に応じて、これをプラグインする他の方法は間違いありません。上記はあなたが提案しているものよりもずっときれいだと思います。