Сравнение прав пользователей

Материал из 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");
        }
    }
}
Личные инструменты