Java - Ibatis - mySQL с динамическим запросом на основе роли

StackOverflow https://stackoverflow.com/questions/463295

  •  19-08-2019
  •  | 
  •  

Вопрос

Я использую Java - Ibatis и mySQL с Flex / Flash на внешнем интерфейсе. У меня есть одно требование, чтобы иметь возможность динамически добавлять 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>

Другие идеи?

Это было полезно?

Решение

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();
  ...
}

, а затем создайте две реализации:

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.

Нет сомнений, что есть другие способы подключить это в зависимости от вашей конфигурации. Я думаю, что вышесказанное намного чище, чем то, что вы предлагаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top