1

フロントエンドに Flex/Flash を搭載した Java - 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>

他のアイデア?

4

2 に答える 2

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>

DAOを作成するよりも少し簡単ですが、すべてのパラメーターマップに役割を含めることなく、他の結合または他のwhere句要素を追加する柔軟性を提供します。

于 2009-01-21T16:36:50.637 に答える
0

クエリ内でロールを使用する際の問題は、おそらくすべてのクエリのクエリへの引数としてそれを提供する必要があることです。クエリに引数を指定する必要がある場合はどうなりますか? これらのパラメーター クラス/マップにもロールを追加する必要があります。それはすべて少し面倒です。

一歩下がって、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 を使用している可能性があります。その場合、 Spring と BlazeDS の統合を使用することをお勧めします。これにより、オプションとして依存性注入が可能になります。

または、単純なファクトリ メソッド (ロールに基づく) を使用して、正しい DAO を取得することもできます。

構成に応じて、これをプラグインする他の方法があることは間違いありません。上記はあなたが提案しているものよりもずっときれいだと思います。

于 2009-01-20T22:19:57.167 に答える