StringBuilder("select * from (").append(sbSql).append(" ) s where s.regionCd like concat("+ regionCd +",'%') ");
}
return sbSql.toString();
ResultInterceptor.java
/*
mybatis данные полномочия перехватчик - handleResultSets
для результатов проводить фильтрацию
@author GaoYuan
@date 2018/4/17 утро 9:52 /* @Intercepts({ @Signature(type = ResultSetHandler.class, method = "handleResultSets", args={Statement.class}) }) @Component public class ResultInterceptor implements Interceptor { /** журнал */ private static final Logger log = LoggerFactory.getLogger(ResultInterceptor.class);
@Override public Object plugin(Object target) { return Plugin.wrap(target, this); }
@Override public void setProperties(Properties properties) {}
@Override public Object intercept(Invocation invocation) throws Throwable { if(log.isInfoEnabled()){ log.info("входить ResultInterceptor перехватчик..."); } ResultSetHandler resultSetHandler1 = (ResultSetHandler) invocation.getTarget(); //через java отражение получать mappedStatement атрибут значение //можно получать mybatis внутри resultype MappedStatement mappedStatement = (MappedStatement)ReflectUtil.getFieldValue(resultSetHandler1, "mappedStatement"); //получать аспект объект PermissionAop permissionAop = PermissionUtils.getPermissionByDelegate(mappedStatement);
//выполнять запрос метод, и сохранять полученный результат в result
Object result = invocation.proceed();
if(permissionAop != null) {
if (result instanceof ArrayList) {
ArrayList resultList = (ArrayList) result;
for (int i = 0; i < resultList.size(); i++) {
Object oi = resultList.get(i);
Class c = oi.getClass();
Class[] types = {String.class};
Method method = c.getMethod("setRegionCd", types);
// вызывать obj объект method метод
method.invoke(oi, "");
if(log.isInfoEnabled()){
log.info("данные полномочия обработка [фильтрация результата]...");
}
}
}
}
return result;
} }
Где PermissionAop для dao слоя пользовательский аспект, используется для включения или выключения данных полномочий фильтрации.
Разные методы перехватчика получать метод немного отличается, конкретный в выше PrepareInterceptor.java и ResultInterceptor.java код самостоятельно проверять.
Из-за разных фреймворков или разных проектов, получение текущего дня логин человека метод может отличаться, тогда только через конфигурацию способ динамически передавать получение текущего логин человека метода
передавать полномочиям центру.
Конфигурационный файл добавлять:
# клиент получать текущий логин человека идентификатор
permission.client.userid.method=com.raising.sc.permission.example.util.UserUtils.getUserId
Затем использовать Java отражение механизма, запускать getUserId( ) метод.
Например, пользователь A может только запрашивать свои собственные единицы и нижестоящие единицы все данные; Конфигурация центра конфигурации где часть sql следующая:
org_cd like concat(${orgCd},'%')
Тогда через PrepareInterceptor.java
читать выше sql, и через базу данных или конфигурацию файла установленные параметры [orgCd] связанные методы (аналогично получению текущего логин человека идентификатора
способ), заранее в полномочиях параметрах (orgCd) конфигурация соответствующий метод путь, параметр значения типа, возвращаемое значение типа и т. д.
Конфигурационный файл или база данных получать orgCd соответствующий метод путь:
com.raising.sc.permission.example.util.UserUtils.getRegionCdByUserId
Конечно, сейчас это просто простой динамический параметр, остальное ещё нужно дальнейшее развитие, здесь только простейшая попытка.
С точки зрения продукта, этот модуль должен иметь три части:
1、foruo-permission-admin данные полномочия управление платформой 2、foruo-permission-server данные полномочия сервер (предоставлять полномочия связанные интерфейсы) 3、foruo-permission-client данные полномочия клиент (упаковывать API)
В сочетании с прикладной логической схемой
можно завершить содержание этого модуля.
Код облака: https://gitee.com/gmarshal/foruo-sc-permission
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )