935090232@qq.com
2022-02-20 c253b555c7905c5136d47cd615ef545fa50cc6ad
zq-erp/src/main/java/com/matrix/system/common/authority/DefaultAuthorityManager.java
@@ -1,8 +1,8 @@
package com.matrix.system.common.authority;
import cn.hutool.crypto.SecureUtil;
import com.matrix.core.constance.MatrixConstance;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.authority.strategy.LoginStrategy;
@@ -10,6 +10,7 @@
import com.matrix.system.common.bean.SysFunction;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.common.init.LocalCache;
import com.matrix.system.common.service.SysFunctionService;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +18,6 @@
import java.util.*;
import java.util.Map.Entry;
import java.util.logging.Logger;
/**
 * DefaultAuthorityManager 实现了权限控制接口
@@ -31,13 +31,19 @@
    private static final int DEFAULT_2 = 2;
    public static final String USER_POWER_REDISKEY = "USER_POWER_";
    public static final String USER_POWER_REDISKEY_PC = "USER_POWER_PC";
    @Autowired
    SysFunctionService sysFunctionService;
    public static final String USERFUNCTION = "userFunction";
    public static final String MENUSFUNCTION = "menusFunction";
    /** 用户所有路径权限的记录 **/
    /**
     * 用户所有路径权限的记录
     **/
    public static final String USER_URL_MAPPING = "userUrlMapping";
    private DefaultAuthorityManager() {
    }
@@ -68,12 +74,19 @@
        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        Map<String, SysFunction> userFunction = WebUtil.getSessionAttribute(USERFUNCTION);
        // 企业管理员不校验按钮权限
        if (AppConstance.USER_TYPE_DEVELOPER.equals(user.getSuUserType())
                || AppConstance.USER_TYPE_SUPER.equals(user.getSuUserType())
                || AppConstance.USER_TYPE_ADMIN.equals(user.getSuUserType())) {
            return true;
        }
        if (userFunction == null) {
            return false;
        } else {
        String[] strs = matchStr.split("-");
        if (strs.length != DEFAULT_2) {
            throw new IllegalArgumentException("权限matchStr格式错误,需要fnCode:btnValue");
@@ -88,8 +101,11 @@
        }
    }
    }
    /**
     * 判断用户是否具有功能权限
     *
     * @return
     */
    @Override
@@ -101,17 +117,22 @@
            return true;
        }
        Map<String, SysFunction> userFunction = WebUtil.getSessionAttribute(USERFUNCTION);
        if (userFunction == null) {
            return false;
        } else {
        SysFunction fn = userFunction.get(fnCode);
        return fn == null ? false : true;
        }
    }
    /**
     * 初始化用户权限
     *
     * @param result
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月5日
     * @param result
     */
    public void initUserPower(AjaxResult result) {
@@ -127,11 +148,34 @@
        // 用户的所有功能权限用id记录,方便后面查询菜单树形结构
        Map<String, SysFunction> menuFunctionMap = new TreeMap<>();
        SysUsers sysUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        String redisKey = USER_POWER_REDISKEY_PC + SecureUtil.md5(sysUser.getSuId() + "");
        Map<String, Object> cachePowerMap = LocalCache.get(redisKey);
        if (Objects.nonNull(cachePowerMap)) {
            userFunction = (Map<String, SysFunction>) cachePowerMap.get(USERFUNCTION);
            menuFunction = (List<SysFunction>) cachePowerMap.get(MENUSFUNCTION);
            userUrlMapping = (List<String>) cachePowerMap.get(USER_URL_MAPPING);
        } else {
        // 获取用户所有权限
        getUserFunction(userFunction, menuFunctionMap, userUrlMapping);
        // 组装菜单
        assembleMenu(menuFunction, menuFunctionMap);
            Map<String, Object> powerMap = new HashMap<>();
            powerMap.put(USERFUNCTION, userFunction);
            powerMap.put(MENUSFUNCTION, menuFunction);
            powerMap.put(USER_URL_MAPPING, userUrlMapping);
            //权限信息加入缓存中
            LocalCache.save(redisKey,powerMap);
        }
        // 把用户菜单和用户的功能都存在session中。
        WebUtil.setSessionAttribute(USERFUNCTION, userFunction);
@@ -145,12 +189,12 @@
    /**
     * 获取用的功能,包括菜单功能和非菜单功能
     *
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月5日
     * @param userFunctionMap
     * @param menuFunctionMap
     * @param userUrlMapping
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月5日
     */
    private void getUserFunction(Map<String, SysFunction> userFunctionMap, Map<String, SysFunction> menuFunctionMap,
                                 List<String> userUrlMapping) {
@@ -204,11 +248,11 @@
    /**
     * 注册功能和按钮的访问路径
     *
     * @param userUrlMapping
     * @param sysFunction
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月8日
     * @param userUrlMapping
     * @param sysFunction
     */
    private void registerUrlMapping(List<String> userUrlMapping, SysFunction sysFunction, boolean isAdmin) {
        String path = sysFunction.getFnPath();
@@ -233,11 +277,11 @@
    /**
     * 把菜单组装成树形结构
     *
     * @param menuFunction
     * @param menuFunctionMap
     * @author JIANGYOUYAO
     * @email 935090232@qq.com
     * @date 2017年12月5日
     * @param menuFunction
     * @param menuFunctionMap
     */
    private void assembleMenu(List<SysFunction> menuFunction, Map<String, SysFunction> menuFunctionMap) {
        // 将map.entrySet()转换成list,并按照功能的FnSequence倒序