6.3. Проверки доступа к данным
Таблица ниже поясняет, как разрешения и ограничения доступа к данным используются различными механизмами фреймворка.
Entity Operations |
Entity Attributes |
Read Constraint |
Read Constraint |
Create/Update/Delete |
|
EntityManager |
Нет |
Нет |
Нет |
Нет |
Нет |
DataManager on middle tier |
Нет |
Да |
Нет |
Нет |
|
DataManager.secure on middle tier DataManager on client tier |
Да (3) |
Нет |
Да |
Да |
Да |
Generic UI data-aware components |
Да |
Да |
- (6) |
- (6) |
- (6) |
REST API |
Да |
Да |
Да |
Да |
Да |
REST API |
Да |
Да |
Да |
Да |
- (7) |
REST API |
Да |
Да |
- (8) |
- (8) |
- (8) |
Замечания:
1) Ограничения чтения с проверкой в базе данных влияют только на корневую сущность.
// order is loaded only if it satisfies constraints on the Order entity
Order order = dataManager.load(Order.class).viewProperties("date", "amount", "customer.name").one();
// related customer is loaded regardless of database-checked constraints on Customer entity
assert order.getCustomer() != null;
2) Ограничения чтения с проверкой в памяти влияют и на корневую сущность, и на все связанные сущности в загруженном графе.
// order is loaded only if it satisfies constraints on the Order entity
Order order = dataManager.load(Order.class).viewProperties("date", "amount", "customer.name").one();
// related customer is not null only if it satisfies in-memory-checked constraints on Customer entity
if (order.getCustomer() != null) ...
3) Разрешения на операцию c сущностью в DataManager проверяются только для корневой сущности.
// loading Order
Order order = dataManager.load(Order.class).viewProperties("date", "amount", "customer.name").one();
// related customer is loaded even if the user has no permission to read the Customer entity
assert order.getCustomer() != null;
4) DataManager проверяет разрешения на операцию c сущностью и in-memory ограничения на среднем слое только если свойство приложения cuba.dataManagerChecksSecurityOnMiddleware установлено в true.
5) DataManager проверяет разрешения на атрибуты сущности только если свойство приложения cuba.entityAttributePermissionChecking установлено в true.
6) UI-компоненты не проверяют ограничения сами, но когда данные загружаются стандартным способом, ограничения налагаются в DataManager. В результате, если некоторый экземпляр сущности отфильтрован ограничениями, соответвующий UI-компонент отображается, но он пустой. Кроме того, любое действие, унаследованное от класса ItemTrackingAction
, можно связать с ограничением определенного типа, так что действие будет доступным только когда проверка ограничения выполнена успешно.
7) REST-запросы выполняют только чтение данных.
8) Параметры и результаты методов REST-сервисов не проверяются на соответствие ограничениям. Поведение сервиса в отношении ограничений определяется тем, как он читает и сохраняет данные, например, использует ли он DataManager
или DataManager.secure()
.