1

我在前端使用带有 Flex/Flash 的 Java - Ibatis 和 mySQL。我有一个要求是能够根据用户角色动态地将 creterias 和表添加到查询中。这是一个例子

相同的对象调用相同的 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();
  ...
}

然后创建两个实现:

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

这种方法的一个优点是,如果某些方法不应该由特定角色使用,您可以选择抛出一些安全违规异常。

现在,如何将它插入到应用程序的其余部分中,我没有足够的细节来评论。您可能正在使用 BlazeDS,在这种情况下,我建议使用Spring 与 BlazeDS 的集成,这将打开依赖注入作为选项。

或者,您可以使用简单的工厂方法(基于角色)来获得正确的 DAO。

毫无疑问,根据您的配置,还有其他方法可以插入它。我认为上面的内容比你提出的要干净得多。

于 2009-01-20T22:19:57.167 回答