Сравнение прав пользователей
Материал из BiTel WiKi
Содержание |
Описание
Скрипт выводит отчёт по правам выбранных пользователей в биллинге в формате csv. Т.к. число столбцов зависит от количества выбранных пользователей, то реализовать этот отчёт в модуле Reports в данный момент не представляется возможным.
Пример
mid;module;action_id;action;Иванов Иван Иванович;Пупкин Василий Леонидович;Сидоров Алексей Владимирович; 0;Ядро;1;Администрирование/Группы/Просмотр групп;;;1; 0;Ядро;1;Администрирование/Группы/Просмотр групп;;;1; 0;Ядро;2;Администрирование/Группы/Просмотр группы;;;1; 0;Ядро;3;Администрирование/Группы/Изменение имени группы;;;; 0;Ядро;4;Администрирование/Группы/Изменение разрешений группы;;;; 0;Ядро;5;Администрирование/Группы/Удаление группы;;;; ...
и т.д.
С разбиением по группам:
;;;;Иванов Иван Иванович;;;Пупкин Василий Леонидович;;;;Сидоров Алексей Владимирович;;;;; mid;module;action_id;action;;ОП;СТП;;ОП;СТП;СТП+;;!Отдел 1;ОП;СТП;СТП+; 0;Ядро;1;Администрирование/Группы/Просмотр групп;;;;;;;;;1;;;; 0;Ядро;1;Администрирование/Группы/Просмотр групп;;;;;;;;;1;;;; 0;Ядро;2;Администрирование/Группы/Просмотр группы;;;;;;;;;1;;;; 0;Ядро;3;Администрирование/Группы/Изменение имени группы;;;;;;;;;;;;; 0;Ядро;4;Администрирование/Группы/Изменение разрешений группы;;;;;;;;;;;;; 0;Ядро;5;Администрирование/Группы/Удаление группы;;;;;;;;;;;;; ...
Входные параметры
Т.к. отчёт реализован в виде глобального скрипта поведения в динамическом коде, то передавать параметры придётся через глобальную конфигурацию сервера:
#список id пользователей для сравнения script.ru.dsi.bgbilling.kernel.scripts.global.CompareUsersReport.users=1,2,3 #нужно ли для каждого пользователя детализировать права по группам, в которых он состоит? script.ru.dsi.bgbilling.kernel.scripts.global.CompareUsersReport.perGroup=0|1
Код скрипта
package ru.dsi.bgbilling.kernel.scripts.global; import bitel.billing.server.admin.bgsecure.bean.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import ru.bitel.bgbilling.common.BGException; import ru.bitel.bgbilling.kernel.module.common.bean.BGModule; import ru.bitel.bgbilling.kernel.module.common.bean.BGSAction; import ru.bitel.bgbilling.kernel.module.common.bean.User; import ru.bitel.bgbilling.kernel.module.server.ModuleCache; import ru.bitel.bgbilling.kernel.module.server.bean.UserManager; import ru.bitel.bgbilling.kernel.plugin.common.BGPluginBase; import ru.bitel.bgbilling.kernel.plugin.server.BGPluginManagerServer; import ru.bitel.bgbilling.kernel.plugin.server.BGPluginServer; import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.Utils; import ru.bitel.common.XMLUtils; import ru.bitel.common.model.IdTitle; import ru.bitel.common.sql.ConnectionSet; import java.io.File; import java.io.FileInputStream; import java.sql.Connection; import java.util.*; //TODO нужно экранировать ";" в данных /** * CSV-отчёт правам пользователей * Параметры отчёта (в конфиге сервера): * #список пользователей для сравнения * script.ru.dsi.bgbilling.kernel.scripts.global.CompareUsersReport.users=1,2,3 * #нужно ли для каждого пользователя детализировать права по группам, в которых он состоит? * script.ru.dsi.bgbilling.kernel.scripts.global.CompareUsersReport.perGroup=0|1 */ public class CompareUsersReport extends GlobalScriptBase { @Override public void execute(Setup setup, ConnectionSet connectionSet) throws Exception { ru.bitel.common.ParameterMap params = setup.sub("script."+this.getClass().getName()+"."); print(params); Map<String, List<ModuleAction>> moduleActions = loadModulesActions(); List<ModuleAction> moduleActionList; List<Integer> userIds = params.getIntegerList("users", Collections.singletonList(1)); //Нужно ли отдельно выводить разрешения для групп каждого пользователя boolean perGroup = params.getBoolean("perGroup",true); Connection con = connectionSet.getConnection(); GroupManager gm = new GroupManager(con); GroupPermitionsManager gpm = new GroupPermitionsManager(con); UserPermitionsManager upm = new UserPermitionsManager(con); UserGroupManager userGroupManager = new UserGroupManager(con); UserManager userManager = new UserManager(con); Map<Integer, String> userNames = new TreeMap<Integer, String>(); Map<Integer, List<BGSAction>> userActions = new HashMap<Integer, List<BGSAction>>(); Map<Integer, List<Integer>> userGroups = new HashMap<Integer, List<Integer>>(); Map<Integer, List<BGSAction>> groupActions = new HashMap<Integer, List<BGSAction>>(); Map<Integer,Group> groupMap = gm.getGroupMap(); User user; List<BGSAction> actions; BGSAction bgsAction; List<Integer> groups; //Справочники для юзеров: for (Integer userId : userIds) { user = userManager.get(userId); if(user!=null){ userNames.put(userId, user.getName()); userActions.put(userId, upm.getUserActions(userId)); groups = userGroupManager.getUserGroups(userId); userGroups.put(userId, groups); //Справочник для групп: for (Integer group : groups) { if(groupActions.get(group)==null){ groupActions.put(group, gpm.getGroupActions(group)); } } } } Group group; //Рисуем заголовок StringBuilder sb; if(perGroup){ sb = new StringBuilder(";;;;"); }else{ sb = new StringBuilder("mid;module;action_id;action;"); } StringBuilder sb1 = new StringBuilder("mid;module;action_id;action;"); for (Map.Entry<Integer, String> userEntry : userNames.entrySet()) { sb.append(userEntry.getValue()); sb.append(";"); sb1.append(";");//Столбец для индивидуальных разрешений юзера if(perGroup){ groups = userGroups.get(userEntry.getKey()); if(groups!=null){ for (Integer groupId : groups) { group = groupMap.get(groupId); if(group!=null){ sb.append(";"); sb1.append(group.getTitle()); sb1.append(";"); }else{ sb.append(";"); sb1.append("null;");//Группа есть в правах, но почему-то нет в справочнике групп } } } } } print(sb.toString()); if(perGroup){ print(sb1.toString()); } //Перебираем все установленные модули ModuleCache moduleCache = ModuleCache.getInstance(); List<BGModule> modulesList = new ArrayList<BGModule>(moduleCache.getModulesList()); BGModule module = new BGModule(); module.setId(0); module.setName("kernel"); module.setTitle("Ядро"); module.setConfigId(0); module.setInstalledModule(null); modulesList.add(module); //отсортируем модули по id Collections.sort(modulesList,new Comparator<BGModule>() { @Override public int compare(BGModule o1, BGModule o2) { return Integer.valueOf(o1.getId()).compareTo(o2.getId()); } }); //добавляем плагины, с mid = -<pluginUID> for (BGPluginBase plugin : BGPluginManagerServer.getManager().getPluginsMap().values()) { if ((plugin instanceof BGPluginServer)) { module = new BGModule(); module.setId(-1*((BGPluginServer)plugin).getPluginUID()); module.setName(plugin.getId()); module.setTitle("Плагин " + plugin.getName()); module.setConfigId(0); module.setInstalledModule(null); modulesList.add(module); } } boolean allowed; for (BGModule bgModule : modulesList) { moduleActionList = moduleActions.get(bgModule.getName()); if(moduleActionList!=null){ for (ModuleAction action : moduleActionList) { sb = new StringBuilder(); if(bgModule.getId()>=0){ sb.append(bgModule.getId()); }else{ sb.append("p"); sb.append(-1*bgModule.getId()); } sb.append(";"); sb.append(bgModule.getTitle()); sb.append(";"); sb.append(action.getId()); sb.append(";"); sb.append(action.getTitle()); sb.append(";"); for (Map.Entry<Integer, String> userEntry : userNames.entrySet()) { allowed = false; actions = userActions.get(userEntry.getKey()); bgsAction = new BGSAction(); if(bgModule.getId()>=0){ bgsAction.mid = String.valueOf(bgModule.getId()); }else{//плагин! bgsAction.mid = "p"+String.valueOf(-1*bgModule.getId()); } bgsAction.actionID = action.getId(); if(actions!=null && actions.contains(bgsAction)){ allowed = true; if(perGroup){ sb.append("1"); } } if(perGroup){ sb.append(";"); } groups = userGroups.get(userEntry.getKey()); if(groups!=null){ for (Integer groupId : groups) { actions = groupActions.get(groupId); if(actions!=null && actions.contains(bgsAction)){ allowed=true; if(perGroup){ sb.append("1"); } } if(perGroup){ sb.append(";"); } } } if(!perGroup){ if(allowed){ sb.append("1"); } sb.append(";"); } } print(sb.toString()); } } } } private Map<String, List<ModuleAction>> loadModulesActions() throws Exception { //module name -> action.id -> action.title Map<String,List<ModuleAction>> moduleMap = new HashMap<String, List<ModuleAction>>(); File actionsCatalog = new File("actions"); if ((!actionsCatalog.exists()) || (!actionsCatalog.isDirectory())) { throw new BGException("Catalog BGBillingServer/actions not found!"); } List<ModuleAction> moduleActions; File[] files = actionsCatalog.listFiles(); if(null==files){ throw new BGException("Catalog BGBillingServer/actions is empty!"); } for (File file : files) { if (!file.isDirectory()) { String moduleName = file.getName(); if (moduleName.endsWith(".xml")) { int pos = moduleName.lastIndexOf("."); if (pos >= 0) { moduleName = moduleName.substring(0, pos); } FileInputStream fis = new FileInputStream(file); Document doc = XMLUtils.parseDocument(fis); Element node = XMLUtils.selectElement(doc, "//actions"); moduleActions = new ArrayList<ModuleAction>(); moduleMap.put(moduleName, moduleActions); loadActions(node,"",moduleActions); fis.close(); } } } return moduleMap; } private void loadActions(Element node, String prefix, List<ModuleAction> moduleActions) { String title; for (Element groupNode : XMLUtils.selectElements(node, "group")){ title = groupNode.getAttribute("title"); loadActions(groupNode, prefix+title+"/", moduleActions); } for (Element description : XMLUtils.selectElements(node, "*[name()='action' or name()='service']")) { try { moduleActions.add(new ModuleAction(description, prefix)); } catch (Exception e) { error(e.getMessage()); } } } class ModuleAction extends IdTitle{ public ModuleAction(Element action, String prefix){ this.id = Utils.parseInt(action.getAttribute("id")); this.title = prefix+action.getAttribute("title"); } } }