Переглянути джерело

优化多角色数据权限匹配规则

RuoYi 3 роки тому
батько
коміт
767f7c8621
24 змінених файлів з 243 додано та 81 видалено
  1. 14 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
  2. 5 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
  3. 10 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java
  4. 26 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
  5. 5 0
      ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java
  6. 11 2
      ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java
  7. 2 2
      ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java
  8. 2 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
  9. 1 26
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
  10. 19 1
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
  11. 21 6
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
  12. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
  13. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
  14. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
  15. 9 2
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java
  16. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
  17. 21 0
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
  18. 27 6
      ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java
  19. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
  20. 0 16
      ruoyi-ui/src/api/system/dept.js
  21. 9 1
      ruoyi-ui/src/api/system/role.js
  22. 8 0
      ruoyi-ui/src/api/system/user.js
  23. 5 12
      ruoyi-ui/src/views/system/role/index.vue
  24. 4 7
      ruoyi-ui/src/views/system/user/index.vue

+ 14 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java

@@ -1,5 +1,6 @@
1 1
 package com.ruoyi.system.api.domain;
2 2
 
3
+import java.util.Set;
3 4
 import javax.validation.constraints.NotBlank;
4 5
 import javax.validation.constraints.Size;
5 6
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -59,6 +60,9 @@ public class SysRole extends BaseEntity
59 60
     /** 部门组(数据权限) */
60 61
     private Long[] deptIds;
61 62
 
63
+    /** 角色菜单权限 */
64
+    private Set<String> permissions;
65
+
62 66
     public SysRole()
63 67
     {
64 68
 
@@ -204,6 +208,16 @@ public class SysRole extends BaseEntity
204 208
         this.deptIds = deptIds;
205 209
     }
206 210
 
211
+    public Set<String> getPermissions()
212
+    {
213
+        return permissions;
214
+    }
215
+
216
+    public void setPermissions(Set<String> permissions)
217
+    {
218
+        this.permissions = permissions;
219
+    }
220
+
207 221
     @Override
208 222
     public String toString() {
209 223
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 5 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java

@@ -41,4 +41,9 @@ public class SecurityConstants
41 41
      * 登录用户
42 42
      */
43 43
     public static final String LOGIN_USER = "login_user";
44
+
45
+    /**
46
+     * 角色权限
47
+     */
48
+    public static final String ROLE_PERMISSION = "role_permission";
44 49
 }

+ 10 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java

@@ -81,6 +81,16 @@ public class SecurityContextHolder
81 81
         set(SecurityConstants.USER_KEY, userKey);
82 82
     }
83 83
 
84
+    public static String getPermission()
85
+    {
86
+        return get(SecurityConstants.ROLE_PERMISSION);
87
+    }
88
+
89
+    public static void setPermission(String permissions)
90
+    {
91
+        set(SecurityConstants.ROLE_PERMISSION, permissions);
92
+    }
93
+
84 94
     public static void remove()
85 95
     {
86 96
         THREAD_LOCAL.remove();

+ 26 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java

@@ -295,6 +295,32 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
295 295
     }
296 296
 
297 297
     /**
298
+     * 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
299
+     *
300
+     * @param set 给定的集合
301
+     * @param array 给定的数组
302
+     * @return boolean 结果
303
+     */
304
+    public static boolean containsAny(Collection<String> collection, String... array)
305
+    {
306
+        if (isEmpty(collection) || isEmpty(array))
307
+        {
308
+            return false;
309
+        }
310
+        else
311
+        {
312
+            for (String str : array)
313
+            {
314
+                if (collection.contains(str))
315
+                {
316
+                    return true;
317
+                }
318
+            }
319
+            return false;
320
+        }
321
+    }
322
+
323
+    /**
298 324
      * 驼峰转下划线命名
299 325
      */
300 326
     public static String toUnderScoreCase(String str)

+ 5 - 0
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java

@@ -25,4 +25,9 @@ public @interface DataScope
25 25
      * 用户表的别名
26 26
      */
27 27
     public String userAlias() default "";
28
+
29
+    /**
30
+     * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
31
+     */
32
+    public String permission() default "";
28 33
 }

+ 11 - 2
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java

@@ -6,6 +6,8 @@ import org.aspectj.lang.JoinPoint;
6 6
 import org.aspectj.lang.annotation.Aspect;
7 7
 import org.aspectj.lang.annotation.Before;
8 8
 import org.springframework.stereotype.Component;
9
+import com.ruoyi.common.core.context.SecurityContextHolder;
10
+import com.ruoyi.common.core.text.Convert;
9 11
 import com.ruoyi.common.core.utils.StringUtils;
10 12
 import com.ruoyi.common.core.web.domain.BaseEntity;
11 13
 import com.ruoyi.common.datascope.annotation.DataScope;
@@ -70,8 +72,9 @@ public class DataScopeAspect
70 72
             // 如果是超级管理员,则不过滤数据
71 73
             if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
72 74
             {
75
+                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), SecurityContextHolder.getPermission());
73 76
                 dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
74
-                        controllerDataScope.userAlias());
77
+                        controllerDataScope.userAlias(), permission);
75 78
             }
76 79
         }
77 80
     }
@@ -83,8 +86,9 @@ public class DataScopeAspect
83 86
      * @param user 用户
84 87
      * @param deptAlias 部门别名
85 88
      * @param userAlias 用户别名
89
+     * @param permission 权限字符
86 90
      */
87
-    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
91
+    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
88 92
     {
89 93
         StringBuilder sqlString = new StringBuilder();
90 94
         List<String> conditions = new ArrayList<String>();
@@ -96,6 +100,11 @@ public class DataScopeAspect
96 100
             {
97 101
                 continue;
98 102
             }
103
+            if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions())
104
+                    && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission)))
105
+            {
106
+                continue;
107
+            }
99 108
             if (DATA_SCOPE_ALL.equals(dataScope))
100 109
             {
101 110
                 sqlString = new StringBuilder();

+ 2 - 2
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java

@@ -124,9 +124,9 @@ public class RedisService
124 124
      * @param collection 多个对象
125 125
      * @return
126 126
      */
127
-    public long deleteObject(final Collection collection)
127
+    public boolean deleteObject(final Collection collection)
128 128
     {
129
-        return redisTemplate.delete(collection);
129
+        return redisTemplate.delete(collection) > 0;
130 130
     }
131 131
 
132 132
     /**

+ 2 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java

@@ -4,6 +4,7 @@ import java.util.Collection;
4 4
 import java.util.HashSet;
5 5
 import java.util.Set;
6 6
 import org.springframework.util.PatternMatchUtils;
7
+import com.ruoyi.common.core.context.SecurityContextHolder;
7 8
 import com.ruoyi.common.core.exception.auth.NotLoginException;
8 9
 import com.ruoyi.common.core.exception.auth.NotPermissionException;
9 10
 import com.ruoyi.common.core.exception.auth.NotRoleException;
@@ -134,6 +135,7 @@ public class AuthLogic
134 135
      */
135 136
     public void checkPermi(RequiresPermissions requiresPermissions)
136 137
     {
138
+        SecurityContextHolder.setPermission(StringUtils.join(requiresPermissions.value(), ","));
137 139
         if (requiresPermissions.logical() == Logical.AND)
138 140
         {
139 141
             checkPermiAnd(requiresPermissions.value());

+ 1 - 26
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java

@@ -1,6 +1,5 @@
1 1
 package com.ruoyi.system.controller;
2 2
 
3
-import java.util.Iterator;
4 3
 import java.util.List;
5 4
 import org.apache.commons.lang3.ArrayUtils;
6 5
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,8 +54,7 @@ public class SysDeptController extends BaseController
55 54
     public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
56 55
     {
57 56
         List<SysDept> depts = deptService.selectDeptList(new SysDept());
58
-        depts.removeIf(d -> d.getDeptId().intValue() == deptId
59
-                || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
57
+        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
60 58
         return AjaxResult.success(depts);
61 59
     }
62 60
 
@@ -72,29 +70,6 @@ public class SysDeptController extends BaseController
72 70
     }
73 71
 
74 72
     /**
75
-     * 获取部门下拉树列表
76
-     */
77
-    @GetMapping("/treeselect")
78
-    public AjaxResult treeselect(SysDept dept)
79
-    {
80
-        List<SysDept> depts = deptService.selectDeptList(dept);
81
-        return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
82
-    }
83
-
84
-    /**
85
-     * 加载对应角色部门列表树
86
-     */
87
-    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
88
-    public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
89
-    {
90
-        List<SysDept> depts = deptService.selectDeptList(new SysDept());
91
-        AjaxResult ajax = AjaxResult.success();
92
-        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
93
-        ajax.put("depts", deptService.buildDeptTreeSelect(depts));
94
-        return ajax;
95
-    }
96
-
97
-    /**
98 73
      * 新增部门
99 74
      */
100 75
     @RequiresPermissions("system:dept:add")

+ 19 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java

@@ -21,9 +21,11 @@ import com.ruoyi.common.log.annotation.Log;
21 21
 import com.ruoyi.common.log.enums.BusinessType;
22 22
 import com.ruoyi.common.security.annotation.RequiresPermissions;
23 23
 import com.ruoyi.common.security.utils.SecurityUtils;
24
+import com.ruoyi.system.api.domain.SysDept;
24 25
 import com.ruoyi.system.api.domain.SysRole;
25 26
 import com.ruoyi.system.api.domain.SysUser;
26 27
 import com.ruoyi.system.domain.SysUserRole;
28
+import com.ruoyi.system.service.ISysDeptService;
27 29
 import com.ruoyi.system.service.ISysRoleService;
28 30
 import com.ruoyi.system.service.ISysUserService;
29 31
 
@@ -42,6 +44,9 @@ public class SysRoleController extends BaseController
42 44
     @Autowired
43 45
     private ISysUserService userService;
44 46
 
47
+    @Autowired
48
+    private ISysDeptService deptService;
49
+
45 50
     @RequiresPermissions("system:role:list")
46 51
     @GetMapping("/list")
47 52
     public TableDataInfo list(SysRole role)
@@ -219,4 +224,17 @@ public class SysRoleController extends BaseController
219 224
         roleService.checkRoleDataScope(roleId);
220 225
         return toAjax(roleService.insertAuthUsers(roleId, userIds));
221 226
     }
222
-}
227
+
228
+    /**
229
+     * 获取对应角色部门树列表
230
+     */
231
+    @RequiresPermissions("system:role:query")
232
+    @GetMapping(value = "/deptTree/{roleId}")
233
+    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
234
+    {
235
+        AjaxResult ajax = AjaxResult.success();
236
+        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
237
+        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
238
+        return ajax;
239
+    }
240
+}

+ 21 - 6
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java

@@ -29,10 +29,12 @@ import com.ruoyi.common.log.enums.BusinessType;
29 29
 import com.ruoyi.common.security.annotation.InnerAuth;
30 30
 import com.ruoyi.common.security.annotation.RequiresPermissions;
31 31
 import com.ruoyi.common.security.utils.SecurityUtils;
32
+import com.ruoyi.system.api.domain.SysDept;
32 33
 import com.ruoyi.system.api.domain.SysRole;
33 34
 import com.ruoyi.system.api.domain.SysUser;
34 35
 import com.ruoyi.system.api.model.LoginUser;
35 36
 import com.ruoyi.system.service.ISysConfigService;
37
+import com.ruoyi.system.service.ISysDeptService;
36 38
 import com.ruoyi.system.service.ISysPermissionService;
37 39
 import com.ruoyi.system.service.ISysPostService;
38 40
 import com.ruoyi.system.service.ISysRoleService;
@@ -54,6 +56,9 @@ public class SysUserController extends BaseController
54 56
     private ISysRoleService roleService;
55 57
 
56 58
     @Autowired
59
+    private ISysDeptService deptService;
60
+
61
+    @Autowired
57 62
     private ISysPostService postService;
58 63
 
59 64
     @Autowired
@@ -116,9 +121,9 @@ public class SysUserController extends BaseController
116 121
             return R.fail("用户名或密码错误");
117 122
         }
118 123
         // 角色集合
119
-        Set<String> roles = permissionService.getRolePermission(sysUser.getUserId());
124
+        Set<String> roles = permissionService.getRolePermission(sysUser);
120 125
         // 权限集合
121
-        Set<String> permissions = permissionService.getMenuPermission(sysUser.getUserId());
126
+        Set<String> permissions = permissionService.getMenuPermission(sysUser);
122 127
         LoginUser sysUserVo = new LoginUser();
123 128
         sysUserVo.setSysUser(sysUser);
124 129
         sysUserVo.setRoles(roles);
@@ -153,13 +158,13 @@ public class SysUserController extends BaseController
153 158
     @GetMapping("getInfo")
154 159
     public AjaxResult getInfo()
155 160
     {
156
-        Long userId = SecurityUtils.getUserId();
161
+        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
157 162
         // 角色集合
158
-        Set<String> roles = permissionService.getRolePermission(userId);
163
+        Set<String> roles = permissionService.getRolePermission(user);
159 164
         // 权限集合
160
-        Set<String> permissions = permissionService.getMenuPermission(userId);
165
+        Set<String> permissions = permissionService.getMenuPermission(user);
161 166
         AjaxResult ajax = AjaxResult.success();
162
-        ajax.put("user", userService.selectUserById(userId));
167
+        ajax.put("user", user);
163 168
         ajax.put("roles", roles);
164 169
         ajax.put("permissions", permissions);
165 170
         return ajax;
@@ -309,4 +314,14 @@ public class SysUserController extends BaseController
309 314
         userService.insertUserAuth(userId, roleIds);
310 315
         return success();
311 316
     }
317
+
318
+    /**
319
+     * 获取部门树列表
320
+     */
321
+    @RequiresPermissions("system:user:list")
322
+    @GetMapping("/deptTree")
323
+    public AjaxResult deptTree(SysDept dept)
324
+    {
325
+        return AjaxResult.success(deptService.selectDeptTreeList(dept));
326
+    }
312 327
 }

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java

@@ -35,6 +35,14 @@ public interface SysMenuMapper
35 35
     public List<SysMenu> selectMenuListByUserId(SysMenu menu);
36 36
 
37 37
     /**
38
+     * 根据角色ID查询权限
39
+     * 
40
+     * @param roleId 角色ID
41
+     * @return 权限列表
42
+     */
43
+    public List<String> selectMenuPermsByRoleId(Long roleId);
44
+
45
+    /**
38 46
      * 根据用户ID查询权限
39 47
      * 
40 48
      * @param userId 用户ID

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java

@@ -20,6 +20,14 @@ public interface ISysDeptService
20 20
     public List<SysDept> selectDeptList(SysDept dept);
21 21
 
22 22
     /**
23
+     * 查询部门树结构信息
24
+     * 
25
+     * @param dept 部门信息
26
+     * @return 部门树信息集合
27
+     */
28
+    public List<TreeSelect> selectDeptTreeList(SysDept dept);
29
+
30
+    /**
23 31
      * 构建前端所需要树结构
24 32
      * 
25 33
      * @param depts 部门列表

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java

@@ -39,6 +39,14 @@ public interface ISysMenuService
39 39
     public Set<String> selectMenuPermsByUserId(Long userId);
40 40
 
41 41
     /**
42
+     * 根据角色ID查询权限
43
+     * 
44
+     * @param roleId 角色ID
45
+     * @return 权限列表
46
+     */
47
+    public Set<String> selectMenuPermsByRoleId(Long roleId);
48
+
49
+    /**
42 50
      * 根据用户ID查询菜单树信息
43 51
      * 
44 52
      * @param userId 用户ID

+ 9 - 2
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java

@@ -2,6 +2,13 @@ package com.ruoyi.system.service;
2 2
 
3 3
 import java.util.Set;
4 4
 
5
+import com.ruoyi.system.api.domain.SysUser;
6
+
7
+/**
8
+ * 权限信息 服务层
9
+ * 
10
+ * @author ruoyi
11
+ */
5 12
 public interface ISysPermissionService
6 13
 {
7 14
     /**
@@ -10,7 +17,7 @@ public interface ISysPermissionService
10 17
      * @param userId 用户Id
11 18
      * @return 角色权限信息
12 19
      */
13
-    public Set<String> getRolePermission(Long userId);
20
+    public Set<String> getRolePermission(SysUser user);
14 21
 
15 22
     /**
16 23
      * 获取菜单数据权限
@@ -18,5 +25,5 @@ public interface ISysPermissionService
18 25
      * @param userId 用户Id
19 26
      * @return 菜单权限信息
20 27
      */
21
-    public Set<String> getMenuPermission(Long userId);
28
+    public Set<String> getMenuPermission(SysUser user);
22 29
 }

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java

@@ -49,6 +49,19 @@ public class SysDeptServiceImpl implements ISysDeptService
49 49
     }
50 50
 
51 51
     /**
52
+     * 查询部门树结构信息
53
+     * 
54
+     * @param dept 部门信息
55
+     * @return 部门树信息集合
56
+     */
57
+    @Override
58
+    public List<TreeSelect> selectDeptTreeList(SysDept dept)
59
+    {
60
+        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
61
+        return buildDeptTreeSelect(depts);
62
+    }
63
+
64
+    /**
52 65
      * 构建前端所需要树结构
53 66
      * 
54 67
      * @param depts 部门列表

+ 21 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java

@@ -101,6 +101,27 @@ public class SysMenuServiceImpl implements ISysMenuService
101 101
     }
102 102
 
103 103
     /**
104
+     * 根据角色ID查询权限
105
+     * 
106
+     * @param roleId 角色ID
107
+     * @return 权限列表
108
+     */
109
+    @Override
110
+    public Set<String> selectMenuPermsByRoleId(Long roleId)
111
+    {
112
+        List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
113
+        Set<String> permsSet = new HashSet<>();
114
+        for (String perm : perms)
115
+        {
116
+            if (StringUtils.isNotEmpty(perm))
117
+            {
118
+                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
119
+            }
120
+        }
121
+        return permsSet;
122
+    }
123
+
124
+    /**
104 125
      * 根据用户ID查询菜单
105 126
      * 
106 127
      * @param userId 用户名称

+ 27 - 6
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java

@@ -1,14 +1,21 @@
1 1
 package com.ruoyi.system.service.impl;
2 2
 
3 3
 import java.util.HashSet;
4
+import java.util.List;
4 5
 import java.util.Set;
5 6
 import org.springframework.beans.factory.annotation.Autowired;
6 7
 import org.springframework.stereotype.Service;
8
+import com.ruoyi.system.api.domain.SysRole;
7 9
 import com.ruoyi.system.api.domain.SysUser;
8 10
 import com.ruoyi.system.service.ISysMenuService;
9 11
 import com.ruoyi.system.service.ISysPermissionService;
10 12
 import com.ruoyi.system.service.ISysRoleService;
11 13
 
14
+/**
15
+ * 用户权限处理
16
+ * 
17
+ * @author ruoyi
18
+ */
12 19
 @Service
13 20
 public class SysPermissionServiceImpl implements ISysPermissionService
14 21
 {
@@ -25,17 +32,17 @@ public class SysPermissionServiceImpl implements ISysPermissionService
25 32
      * @return 角色权限信息
26 33
      */
27 34
     @Override
28
-    public Set<String> getRolePermission(Long userId)
35
+    public Set<String> getRolePermission(SysUser user)
29 36
     {
30 37
         Set<String> roles = new HashSet<String>();
31 38
         // 管理员拥有所有权限
32
-        if (SysUser.isAdmin(userId))
39
+        if (user.isAdmin())
33 40
         {
34 41
             roles.add("admin");
35 42
         }
36 43
         else
37 44
         {
38
-            roles.addAll(roleService.selectRolePermissionByUserId(userId));
45
+            roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));
39 46
         }
40 47
         return roles;
41 48
     }
@@ -47,17 +54,31 @@ public class SysPermissionServiceImpl implements ISysPermissionService
47 54
      * @return 菜单权限信息
48 55
      */
49 56
     @Override
50
-    public Set<String> getMenuPermission(Long userId)
57
+    public Set<String> getMenuPermission(SysUser user)
51 58
     {
52 59
         Set<String> perms = new HashSet<String>();
53 60
         // 管理员拥有所有权限
54
-        if (SysUser.isAdmin(userId))
61
+        if (user.isAdmin())
55 62
         {
56 63
             perms.add("*:*:*");
57 64
         }
58 65
         else
59 66
         {
60
-            perms.addAll(menuService.selectMenuPermsByUserId(userId));
67
+            List<SysRole> roles = user.getRoles();
68
+            if (!roles.isEmpty() && roles.size() > 1)
69
+            {
70
+                // 多角色设置permissions属性,以便数据权限匹配权限
71
+                for (SysRole role : roles)
72
+                {
73
+                    Set<String> rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
74
+                    role.setPermissions(rolePerms);
75
+                    perms.addAll(rolePerms);
76
+                }
77
+            }
78
+            else
79
+            {
80
+                perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
81
+            }
61 82
         }
62 83
         return perms;
63 84
     }

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -111,6 +111,13 @@
111 111
 		where m.status = '0' and r.status = '0' and ur.user_id = #{userId}
112 112
 	</select>
113 113
 	
114
+	<select id="selectMenuPermsByRoleId" parameterType="Long" resultType="String">
115
+		select distinct m.perms
116
+		from sys_menu m
117
+			 left join sys_role_menu rm on m.menu_id = rm.menu_id
118
+		where m.status = '0' and rm.role_id = #{roleId}
119
+	</select>
120
+	
114 121
 	<select id="selectMenuById" parameterType="Long" resultMap="SysMenuResult">
115 122
 		<include refid="selectMenuVo"/>
116 123
 		where menu_id = #{menuId}

+ 0 - 16
ruoyi-ui/src/api/system/dept.js

@@ -25,22 +25,6 @@ export function getDept(deptId) {
25 25
   })
26 26
 }
27 27
 
28
-// 查询部门下拉树结构
29
-export function treeselect() {
30
-  return request({
31
-    url: '/system/dept/treeselect',
32
-    method: 'get'
33
-  })
34
-}
35
-
36
-// 根据角色ID查询部门树结构
37
-export function roleDeptTreeselect(roleId) {
38
-  return request({
39
-    url: '/system/dept/roleDeptTreeselect/' + roleId,
40
-    method: 'get'
41
-  })
42
-}
43
-
44 28
 // 新增部门
45 29
 export function addDept(data) {
46 30
   return request({

+ 9 - 1
ruoyi-ui/src/api/system/role.js

@@ -108,4 +108,12 @@ export function authUserSelectAll(data) {
108 108
     method: 'put',
109 109
     params: data
110 110
   })
111
-}
111
+}
112
+
113
+// 根据角色ID查询部门树结构
114
+export function deptTreeSelect(roleId) {
115
+  return request({
116
+    url: '/system/role/deptTree/' + roleId,
117
+    method: 'get'
118
+  })
119
+}

+ 8 - 0
ruoyi-ui/src/api/system/user.js

@@ -125,3 +125,11 @@ export function updateAuthRole(data) {
125 125
     params: data
126 126
   })
127 127
 }
128
+
129
+// 查询部门下拉树结构
130
+export function deptTreeSelect() {
131
+  return request({
132
+    url: '/system/user/deptTree',
133
+    method: 'get'
134
+  })
135
+}

+ 5 - 12
ruoyi-ui/src/views/system/role/index.vue

@@ -254,9 +254,8 @@
254 254
 </template>
255 255
 
256 256
 <script>
257
-import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus } from "@/api/system/role";
257
+import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect } from "@/api/system/role";
258 258
 import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu";
259
-import { treeselect as deptTreeselect, roleDeptTreeselect } from "@/api/system/dept";
260 259
 
261 260
 export default {
262 261
   name: "Role",
@@ -364,12 +363,6 @@ export default {
364 363
         this.menuOptions = response.data;
365 364
       });
366 365
     },
367
-    /** 查询部门树结构 */
368
-    getDeptTreeselect() {
369
-      deptTreeselect().then(response => {
370
-        this.deptOptions = response.data;
371
-      });
372
-    },
373 366
     // 所有菜单节点数据
374 367
     getMenuAllCheckedKeys() {
375 368
       // 目前被选中的菜单节点
@@ -396,8 +389,8 @@ export default {
396 389
       });
397 390
     },
398 391
     /** 根据角色ID查询部门树结构 */
399
-    getRoleDeptTreeselect(roleId) {
400
-      return roleDeptTreeselect(roleId).then(response => {
392
+    getDeptTree(roleId) {
393
+      return deptTreeSelect(roleId).then(response => {
401 394
         this.deptOptions = response.depts;
402 395
         return response;
403 396
       });
@@ -543,12 +536,12 @@ export default {
543 536
     /** 分配数据权限操作 */
544 537
     handleDataScope(row) {
545 538
       this.reset();
546
-      const roleDeptTreeselect = this.getRoleDeptTreeselect(row.roleId);
539
+      const deptTreeSelect = this.getDeptTree(row.roleId);
547 540
       getRole(row.roleId).then(response => {
548 541
         this.form = response.data;
549 542
         this.openDataScope = true;
550 543
         this.$nextTick(() => {
551
-          roleDeptTreeselect.then(res => {
544
+          deptTreeSelect.then(res => {
552 545
             this.$refs.dept.setCheckedKeys(res.checkedKeys);
553 546
           });
554 547
         });

+ 4 - 7
ruoyi-ui/src/views/system/user/index.vue

@@ -342,9 +342,8 @@
342 342
 </template>
343 343
 
344 344
 <script>
345
-import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from "@/api/system/user";
345
+import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user";
346 346
 import { getToken } from "@/utils/auth";
347
-import { treeselect } from "@/api/system/dept";
348 347
 import Treeselect from "@riophae/vue-treeselect";
349 348
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
350 349
 
@@ -462,7 +461,7 @@ export default {
462 461
   },
463 462
   created() {
464 463
     this.getList();
465
-    this.getTreeselect();
464
+    this.getDeptTree();
466 465
     this.getConfigKey("sys.user.initPassword").then(response => {
467 466
       this.initPassword = response.msg;
468 467
     });
@@ -479,8 +478,8 @@ export default {
479 478
       );
480 479
     },
481 480
     /** 查询部门下拉树结构 */
482
-    getTreeselect() {
483
-      treeselect().then(response => {
481
+    getDeptTree() {
482
+      deptTreeSelect().then(response => {
484 483
         this.deptOptions = response.data;
485 484
       });
486 485
     },
@@ -561,7 +560,6 @@ export default {
561 560
     /** 新增按钮操作 */
562 561
     handleAdd() {
563 562
       this.reset();
564
-      this.getTreeselect();
565 563
       getUser().then(response => {
566 564
         this.postOptions = response.posts;
567 565
         this.roleOptions = response.roles;
@@ -573,7 +571,6 @@ export default {
573 571
     /** 修改按钮操作 */
574 572
     handleUpdate(row) {
575 573
       this.reset();
576
-      this.getTreeselect();
577 574
       const userId = row.userId || this.ids;
578 575
       getUser(userId).then(response => {
579 576
         this.form = response.data;