Java - Ibatis - mySQL с динамическим запросом на основе роли
-
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.
Нет сомнений, что есть другие способы подключить это в зависимости от вашей конфигурации. Я думаю, что вышесказанное намного чище, чем то, что вы предлагаете.