【问题标题】:Java - Ibatis - mySQL with Dynamic Query based on RoleJava - Ibatis - mySQL 与基于角色的动态查询
【发布时间】:2009-01-20 21:53:35
【问题描述】:

我在前端使用带有 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>

其他想法?

【问题讨论】:

    标签: java ibatis dynamic-sql


    【解决方案1】:
    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 子句元素的灵活性,而不必在每个参数映射中包含角色

    【讨论】:

      【解决方案2】:

      在查询中使用角色的问题在于,您必须将其作为参数提供给可能每个查询的查询。当您需要为查询提供参数时会发生什么?您还需要为这些参数类/映射添加角色。有点乱。

      我会退后一步,定义你的 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 integration with BlazeDS,它将打开依赖注入作为选项。

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

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

      【讨论】:

      • 我唯一遇到的问题是大多数 DAO 都受制于安全列表子查询,所以我必须为我的大多数对象创建 2 个 DAO,一个 SUPER 一个 Limited,看起来有很多代码......有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2017-07-17
      相关资源
      最近更新 更多