Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

谭斌 2 жил өмнө
parent
commit
462f02f23b

+ 3 - 0
authorize-api-service/src/main/java/com/xy/entity/join/SysMenuJoinSysRoleMenu.java

@@ -7,6 +7,9 @@ import lombok.experimental.Accessors;
 import java.io.Serializable;
 import java.util.List;
 
+/**
+ * 菜单表和角色菜单表关联实体
+ */
 @Data
 @Accessors(chain = true)
 public class SysMenuJoinSysRoleMenu extends SysMenu implements Serializable {

+ 99 - 11
authorize-api-service/src/main/java/com/xy/redis/RedisCache.java

@@ -1,6 +1,7 @@
 package com.xy.redis;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.xy.collections.list.JArrayList;
 import com.xy.collections.list.JList;
 import com.xy.collections.map.JMap;
@@ -9,10 +10,7 @@ import com.xy.entity.join.SysMenuJoinSysRoleMenu;
 import com.xy.mapper.SysMenuMapper;
 import com.xy.mapper.SysRoleMapper;
 import com.xy.mapper.SysSystemMapper;
-import com.xy.utils.Beans;
-import com.xy.utils.Emptys;
-import com.xy.utils.RedisService;
-import com.xy.utils.SpringBeanUtils;
+import com.xy.utils.*;
 import icu.mhb.mybatisplus.plugln.core.JoinLambdaWrapper;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -20,10 +18,23 @@ import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+/**
+ * 权限系统redis工具类
+ */
 @Component
 public class RedisCache {
 
+    /**
+     * 权限系统默认系统ID,代表本系统
+     */
+    private static final String DEFAULT_STSTEM_ID = "1";
+
+    private static RedisService<List<CacheEntity>> getRedisService() {
+        return SpringBeanUtils.getBean(RedisService.class);
+    }
+
     private static String getKey(Long loginId) {
         return String.format("%s:%d", "menu", loginId);
     }
@@ -37,7 +48,7 @@ public class RedisCache {
         SysSystemMapper sysSystemMapper = SpringBeanUtils.getBean(SysSystemMapper.class);
         SysRoleMapper sysRoleMapper = SpringBeanUtils.getBean(SysRoleMapper.class);
         SysMenuMapper sysMenuMapper = SpringBeanUtils.getBean(SysMenuMapper.class);
-        RedisService<List<CacheEntity>> roleMenuRedisService = SpringBeanUtils.getBean(RedisService.class);
+        RedisService<List<CacheEntity>> roleMenuRedisService = getRedisService();
         //获取登录人所有系统
         List<SysSystem> sysSystems = sysSystemMapper.selectList(new LambdaQueryWrapper<SysSystem>()
                 .eq(SysSystem::getSysUserId, loginId)
@@ -82,21 +93,31 @@ public class RedisCache {
     }
 
     /**
-     * 获取菜单
+     * 获取菜单
      *
-     * @param loginId  登录id
-     * @param systemId 系统id
+     * @param loginId 登录id
      * @return
      */
-    public static List<SysMenuJoinSysRoleMenu> getMenuTree(Long loginId, Long systemId) {
+    public static List<SysMenuJoinSysRoleMenu> getMenu(Long loginId) {
         //获取redis缓存
-        RedisService<List<CacheEntity>> roleMenuRedisService = SpringBeanUtils.getBean(RedisService.class);
-        List<CacheEntity> cacheEntities = roleMenuRedisService.getMap(getKey(loginId), systemId.toString());
+        List<CacheEntity> cacheEntities = getRedisService().getMap(getKey(loginId), DEFAULT_STSTEM_ID);
         //角色菜单累加
         JList<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenus = new JArrayList<>();
         cacheEntities.forEach(cacheEntity -> sysMenuJoinSysRoleMenus.addAll(cacheEntity.getList()));
         //去重
         sysMenuJoinSysRoleMenus.comparing(SysMenuJoinSysRoleMenu::getId);
+        return sysMenuJoinSysRoleMenus;
+    }
+
+    /**
+     * 获取菜单树
+     *
+     * @param loginId 登录id
+     * @return
+     */
+    public static List<SysMenuJoinSysRoleMenu> getMenuTree(Long loginId) {
+        //获取菜单
+        JList<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenus = new JArrayList<>(getMenu(loginId));
         //生成树
         JList<SysMenuJoinSysRoleMenu> tops = sysMenuJoinSysRoleMenus.filter().isNull(SysMenuJoinSysRoleMenu::getPaterId).list();
         for (SysMenuJoinSysRoleMenu top : tops) {
@@ -106,6 +127,73 @@ public class RedisCache {
         return tops;
     }
 
+    /**
+     * 判断数据查询权限
+     *
+     * @param loginId 登录id
+     * @param dataUri 数据接口uri
+     * @return true=管理员数据查询权限 false=普通查询权限
+     */
+    public static boolean getDataAuth(Long loginId, String dataUri) {
+        //获取redis缓存
+        List<CacheEntity> cacheEntities = getRedisService().getMap(getKey(loginId), DEFAULT_STSTEM_ID);
+        //遍历角色
+        for (CacheEntity cacheEntity : cacheEntities) {
+            //根据 接口uri和管理员数据查询权限=true 查找角色菜单,找到则有管理员数据查询权限,反之普通查询权限
+            SysMenuJoinSysRoleMenu sysMenuJoinSysRoleMenu = new JArrayList<>(cacheEntity.getList()).filter()
+                    .eq(SysMenuJoinSysRoleMenu::getInterfaceUri, dataUri)
+                    .eq(SysMenuJoinSysRoleMenu::getSelectIsAdmin, true)
+                    .object();
+            if (sysMenuJoinSysRoleMenu != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 判断数据查询权限
+     *
+     * @param loginId            登录id
+     * @param dataUri            数据接口uri
+     * @param lambdaQueryWrapper 查询构造器
+     * @param function           普通查询权限时,条件lambda引用字段
+     * @return true=管理员数据查询权限 false=普通查询权限
+     */
+    public static <T> boolean getDataAuth(Long loginId, String dataUri, LambdaQueryWrapper<T> lambdaQueryWrapper, SFunction<T, ?> function) {
+        boolean dataAuth = getDataAuth(loginId, dataUri);
+        if (!dataAuth) {
+            lambdaQueryWrapper.eq(function, loginId);
+        }
+        return false;
+    }
+
+    /**
+     * 获取所有系统ID
+     *
+     * @param loginId 登录id
+     * @return
+     */
+    public static List<Long> getSystemIds(Long loginId) {
+        Map<String, List<CacheEntity>> map = getRedisService().getMap(getKey(loginId));
+        List<Long> list = new ArrayList<>(map.size());
+        map.forEach((s, cacheEntities) -> list.add(Long.parseLong(s)));
+        return list;
+    }
+
+    /**
+     * 获取所有角色ID
+     *
+     * @param loginId 登录id
+     * @return
+     */
+    public static List<Long> getRoleIds(Long loginId) {
+        List<CacheEntity> cacheEntities = getRedisService().getMap(getKey(loginId), DEFAULT_STSTEM_ID);
+        List<Long> list = new ArrayList<>(cacheEntities.size());
+        cacheEntities.forEach(cacheEntity -> list.add(Long.parseLong(cacheEntity.getRoleId().toString())));
+        return list;
+    }
+
     @Data
     @Accessors(chain = true)
     public static class CacheEntity {

+ 0 - 22
authorize-api-service/src/main/java/com/xy/redis/TestService.java

@@ -1,22 +0,0 @@
-package com.xy.redis;
-
-import com.xy.annotate.RestMappingController;
-import com.xy.entity.join.SysMenuJoinSysRoleMenu;
-import com.xy.utils.SaTokenUtils;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
-
-import java.util.List;
-
-@Api(tags = "测试")
-@RestMappingController("test")
-public class TestService {
-
-    @ApiOperation("测试")
-    @GetMapping("test")
-    public List<SysMenuJoinSysRoleMenu> test() {
-        return RedisCache.getMenuTree(Long.parseLong(SaTokenUtils.getId().toString()), 1L);
-    }
-
-}

+ 7 - 1
authorize-api-service/src/main/java/com/xy/service/impl/SysSystemServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xy.dto.SysSystemDto;
 import com.xy.entity.SysSystem;
 import com.xy.mapper.SysSystemMapper;
+import com.xy.redis.RedisCache;
 import com.xy.service.SysSystemService;
 import com.xy.utils.MybatisPlusQuery;
 import com.xy.utils.PageBean;
@@ -19,6 +20,8 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
+import javax.servlet.http.HttpServletRequest;
+
 import static com.xy.utils.Beans.copy;
 import static com.xy.utils.PlusBeans.toIPage;
 import static com.xy.utils.PlusBeans.toPageBean;
@@ -36,6 +39,8 @@ import static com.xy.utils.PlusBeans.toPageBean;
 @AllArgsConstructor
 public class SysSystemServiceImpl extends ServiceImpl<SysSystemMapper, SysSystem> implements SysSystemService {
 
+    private HttpServletRequest request;
+
     @PostMapping("save")
     @ApiOperation("添加系统")
     public R<Long> save(@RequestBody @Validated SysSystemDto.Save save) {
@@ -54,12 +59,13 @@ public class SysSystemServiceImpl extends ServiceImpl<SysSystemMapper, SysSystem
     @PostMapping("page")
     @ApiOperation("分页查询")
     public R<PageBean<SysSystemDto.Vo>> page(@RequestBody SysSystemDto.Select select) {
-        long loginId = Long.parseLong(SaTokenUtils.getId().toString());
         LambdaQueryWrapper<SysSystem> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(select, SysSystem.class)
                 .ge(SysSystem::getCreateTime, select.getBeginCreateTime())
                 .le(SysSystem::getCreateTime, select.getEndCreateTime())
                 .like(SysSystem::getName)
                 .build();
+        //判断数据权限
+        RedisCache.getDataAuth(Long.parseLong(SaTokenUtils.getId().toString()), request.getRequestURI(), lambdaQueryWrapper, SysSystem::getSysUserId);
         IPage<SysSystem> page = page(toIPage(select.getPage()), lambdaQueryWrapper);
         return R.ok(toPageBean(SysSystemDto.Vo.class, page));
     }