net.n2oapp.framework.access.simple.PermissionAndRoleCollector Maven / Gradle / Ivy
package net.n2oapp.framework.access.simple;
import net.n2oapp.framework.access.api.model.filter.N2oAccessFilter;
import net.n2oapp.framework.access.functions.TripleFunction;
import net.n2oapp.framework.access.metadata.accesspoint.AccessPoint;
import net.n2oapp.framework.access.metadata.accesspoint.model.*;
import net.n2oapp.framework.access.metadata.schema.permission.N2oPermission;
import net.n2oapp.framework.access.metadata.schema.role.N2oRole;
import net.n2oapp.framework.access.metadata.schema.simple.SimpleCompiledAccessSchema;
import net.n2oapp.framework.access.metadata.schema.user.N2oUserAccess;
import net.n2oapp.framework.api.StringUtils;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import static java.util.Arrays.stream;
/**
* Сбор точек доступа по ролям, правам пользователя
*/
@SuppressWarnings("unchecked")
public class PermissionAndRoleCollector {
public final static BiFunction> OBJECT_ACCESS = (objectId, actionId) ->
ac -> StringUtils.maskMatch(ac.getObjectId(), objectId) &&
(actionId == null || StringUtils.maskMatch(ac.getAction(), actionId));
public final static Function> URL_ACCESS = pattern -> ac -> ac.getMatcher().matches(pattern);
public final static Function> PAGE_ACCESS = pageId -> ac -> ac.getPage().equals(pageId);
public final static Function> REFERENCE_ACCESS = objectId -> ac -> ac.getObjectId().equals(objectId);
public final static TripleFunction> COLUMN_ACCESS = (pageId, containerId, columnId) ->
ac -> ac.getPageId().equals(pageId) && ac.getContainerId().equals(containerId) && ac.getColumnId().equals(columnId);
public final static BiFunction> FILTER_ACCESS = (queryId, filterId) ->
ac -> ac.getQueryId().equals(queryId) && ac.getFilterId().equals(filterId);
/**
* Собирает все элементы доступа типа role
*
* @param type тип обрабатываемой единицы
* @param predicate функция проверки обрабатываемой единицы на соответствие заданным условиям
* @param
* @return
*/
public static List collectRoles(Class type, Predicate predicate, SimpleCompiledAccessSchema schema) {
return collect(() -> schema.getN2oRoles(), N2oRole::getAccessPoints, type, predicate);
}
/**
* Собирает все элементы доступа типа permission
*
* @param type тип обрабатываемой единицы
* @param predicate функция проверки обрабатываемой единицы на соответствие заданным условиям
* @param
* @return
*/
public static List collectPermission(Class type, Predicate predicate, SimpleCompiledAccessSchema schema) {
return collect(() -> schema.getN2oPermissions(), N2oPermission::getAccessPoints, type, predicate);
}
/**
* Собирает все элементы доступа типа user
*
* @param type тип обрабатываемой единицы
* @param predicate функция проверки обрабатываемой единицы на соответствие заданным условиям
* @param
* @return
*/
public static List collectUsers(Class type, Predicate predicate, SimpleCompiledAccessSchema schema) {
return collect(() -> schema.getN2oUserAccesses(), N2oUserAccess::getAccessPoints, type, predicate);
}
/**
* @param supplier список сколлекционированных элементов
* @param getter список access points
* @param type тип обрабатываемых единиц
* @param predicate функция проверки обрабатываемых единиц на соответствие заданным условиям
* @param
* @param
* @return
*/
public static List collect(Supplier> supplier, Function getter,
Class type, Predicate predicate) {
List ts = supplier.get();
if (ts == null || ts.size() == 0) {
return Collections.emptyList();
}
return ts.stream().filter(p -> stream(getter.apply(p))
.filter(type::isInstance)
.map(type::cast)
.anyMatch(predicate))
.collect(Collectors.toList());
}
/**
* Возвращает все фильтры доступа по объекту и действию
*
* @param rolePredicate функция проверки обрабатываемых единиц(role) на соответствие заданным условиям
* @param permissionPredicate функция проверки обрабатываемых единиц(permission) на соответствие заданным условиям
* @param userPredicate функция проверки обрабатываемых единиц(user) на соответствие заданным условиям
* @param objectId id проверяемого объекта
* @param actionId id проверяемого действия
* @return фильтры доступа
*/
public static List collectFilters(Predicate rolePredicate, Predicate permissionPredicate,
Predicate userPredicate, String objectId,
String actionId, SimpleCompiledAccessSchema schema) {
List roles = collectRoles(N2oObjectAccessPoint.class, PermissionAndRoleCollector.OBJECT_ACCESS.apply(objectId, actionId), schema)
.stream().filter(rolePredicate).collect(Collectors.toList());
List permissions = collectPermission(N2oObjectAccessPoint.class,
PermissionAndRoleCollector.OBJECT_ACCESS.apply(objectId, actionId), schema)
.stream().filter(permissionPredicate).collect(Collectors.toList());
List users = collectUsers(N2oObjectAccessPoint.class, PermissionAndRoleCollector.OBJECT_ACCESS.apply(objectId, actionId), schema)
.stream().filter(userPredicate).collect(Collectors.toList());
List filters = new ArrayList<>();
filters.addAll(collectFilters(roles, N2oRole::getAccessPoints, objectId, actionId));
filters.addAll(collectFilters(permissions, N2oPermission::getAccessPoints, objectId, actionId));
filters.addAll(collectFilters(users, N2oUserAccess::getAccessPoints, objectId, actionId));
return filters;
}
private static List collectFilters(List list, Function getter, String objectId, String actionId) {
return null;
//todo изменилась логика сборки фильтров. данный код надо удалить или переписать с учетом новой логики
/*return list.stream()
.map(getter)
.filter(Objects::nonNull)
.flatMap(Arrays::stream)
.filter(N2oObjectAccessPoint.class::isInstance)
.map(N2oObjectAccessPoint.class::cast)
.filter(o -> o.getObjectId().equals(objectId) && o.getAction().equals(actionId))
.filter(o -> o.getAccessFilters() != null)
.flatMap(o -> o.getAccessFiltersAsList().stream())
.map(ac -> {
if (ac.getValues() != null && ac.getValues().length>0) {
return new N2oAccessFilter(ac.getFieldId(), Arrays.asList(ac.getValues()), ac.getType());
} else {
return new N2oAccessFilter(ac.getFieldId(), ac.getValue(), ac.getType());
}
})
.collect(Collectors.toList());*/
}
}