RuoYi
2022-08-21 a36dc6635f92b1a6a5ea43c801f028dea08a7f0b
优化多角色数据权限匹配规则
已修改15个文件
已添加1个文件
203 ■■■■ 文件已修改
src/main/java/com/ruoyi/common/constant/UserConstants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/lang/annotation/DataScope.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/security/service/PermissionService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/security/service/SysPermissionService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysDeptController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysRoleController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysUserController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysRole.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysMenuMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysMenuService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysMenuServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/system/SysMenuMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/constant/UserConstants.java
@@ -12,6 +12,11 @@
     */
    public static final String SYS_USER = "SYS_USER";
    /**
     * ss标记的权限字符
     */
    public static final String SS_PERMISSION = "SS_PERMISSION";
    /** æ­£å¸¸çŠ¶æ€ */
    public static final String NORMAL = "0";
src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
@@ -10,6 +10,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.security.context.PermissionContextHolder;
import com.ruoyi.framework.web.domain.BaseEntity;
import com.ruoyi.project.system.domain.SysRole;
import com.ruoyi.project.system.domain.SysUser;
@@ -70,8 +71,9 @@
            // å¦‚果是超级管理员,则不过滤数据
            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
            {
                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
                        controllerDataScope.userAlias());
                        controllerDataScope.userAlias(), permission);
            }
        }
    }
@@ -83,8 +85,9 @@
     * @param user ç”¨æˆ·
     * @param deptAlias éƒ¨é—¨åˆ«å
     * @param userAlias ç”¨æˆ·åˆ«å
     * @param permission æƒé™å­—符
     */
    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
    {
        StringBuilder sqlString = new StringBuilder();
        List<String> conditions = new ArrayList<String>();
@@ -96,6 +99,10 @@
            {
                continue;
            }
            if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) && !role.getPermissions().contains(permission))
            {
                continue;
            }
            if (DATA_SCOPE_ALL.equals(dataScope))
            {
                sqlString = new StringBuilder();
src/main/java/com/ruoyi/framework/aspectj/lang/annotation/DataScope.java
@@ -25,4 +25,9 @@
     * ç”¨æˆ·è¡¨çš„别名
     */
    public String userAlias() default "";
    /**
     * æƒé™å­—符(如不填默认会自动根据注解获取)
     */
    public String permission() default "";
}
src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.framework.security.context;
/**
 * æƒé™ä¿¡æ¯
 *
 * @author ruoyi
 */
public class PermissionContextHolder
{
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
    public static void setContext(String permission)
    {
        contextHolder.set(permission);
    }
    public static String getContext()
    {
        return contextHolder.get();
    }
}
src/main/java/com/ruoyi/framework/security/service/PermissionService.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.security.context.PermissionContextHolder;
import com.ruoyi.project.system.domain.SysRole;
/**
@@ -43,6 +44,7 @@
        {
            return false;
        }
        PermissionContextHolder.setContext(permission);
        return hasPermissions(loginUser.getPermissions(), permission);
    }
src/main/java/com/ruoyi/framework/security/service/SysPermissionService.java
@@ -1,9 +1,11 @@
package com.ruoyi.framework.security.service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.project.system.domain.SysRole;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.service.ISysMenuService;
import com.ruoyi.project.system.service.ISysRoleService;
@@ -59,7 +61,21 @@
        }
        else
        {
            perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
            List<SysRole> roles = user.getRoles();
            if (!roles.isEmpty() && roles.size() > 1)
            {
                // å¤šè§’色设置permissions属性,以便数据权限匹配权限
                for (SysRole role : roles)
                {
                    Set<String> rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
                    role.setPermissions(rolePerms);
                    perms.addAll(rolePerms);
                }
            }
            else
            {
                perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
            }
        }
        return perms;
    }
src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
@@ -79,29 +79,6 @@
    }
    /**
     * èŽ·å–éƒ¨é—¨ä¸‹æ‹‰æ ‘åˆ—è¡¨
     */
    @GetMapping("/treeselect")
    public AjaxResult treeselect(SysDept dept)
    {
        List<SysDept> depts = deptService.selectDeptList(dept);
        return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
    }
    /**
     * åŠ è½½å¯¹åº”è§’è‰²éƒ¨é—¨åˆ—è¡¨æ ‘
     */
    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
    public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
    {
        List<SysDept> depts = deptService.selectDeptList(new SysDept());
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.buildDeptTreeSelect(depts));
        return ajax;
    }
    /**
     * æ–°å¢žéƒ¨é—¨
     */
    @PreAuthorize("@ss.hasPermi('system:dept:add')")
src/main/java/com/ruoyi/project/system/controller/SysRoleController.java
@@ -24,9 +24,11 @@
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysRole;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.SysUserRole;
import com.ruoyi.project.system.service.ISysDeptService;
import com.ruoyi.project.system.service.ISysRoleService;
import com.ruoyi.project.system.service.ISysUserService;
@@ -50,6 +52,9 @@
    
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/list")
@@ -242,4 +247,17 @@
        roleService.checkRoleDataScope(roleId);
        return toAjax(roleService.insertAuthUsers(roleId, userIds));
    }
}
    /**
     * èŽ·å–å¯¹åº”è§’è‰²éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping(value = "/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
    {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
        return ajax;
    }
}
src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -25,8 +25,10 @@
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysRole;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.service.ISysDeptService;
import com.ruoyi.project.system.service.ISysPostService;
import com.ruoyi.project.system.service.ISysRoleService;
import com.ruoyi.project.system.service.ISysUserService;
@@ -45,6 +47,9 @@
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    private ISysPostService postService;
@@ -234,4 +239,14 @@
        userService.insertUserAuth(userId, roleIds);
        return success();
    }
}
    /**
     * èŽ·å–éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept)
    {
        return AjaxResult.success(deptService.selectDeptTreeList(dept));
    }
}
src/main/java/com/ruoyi/project/system/domain/SysRole.java
@@ -1,5 +1,6 @@
package com.ruoyi.project.system.domain;
import java.util.Set;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -58,6 +59,9 @@
    /** éƒ¨é—¨ç»„(数据权限) */
    private Long[] deptIds;
    /** è§’色菜单权限 */
    private Set<String> permissions;
    public SysRole()
    {
@@ -203,7 +207,17 @@
    {
        this.deptIds = deptIds;
    }
    public Set<String> getPermissions()
    {
        return permissions;
    }
    public void setPermissions(Set<String> permissions)
    {
        this.permissions = permissions;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
src/main/java/com/ruoyi/project/system/mapper/SysMenuMapper.java
@@ -43,6 +43,14 @@
    public List<String> selectMenuPermsByUserId(Long userId);
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    public List<String> selectMenuPermsByRoleId(Long roleId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     * 
     * @return èœå•列表
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
@@ -20,6 +20,14 @@
    public List<SysDept> selectDeptList(SysDept dept);
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨æ ‘信息集合
     */
    public List<TreeSelect> selectDeptTreeList(SysDept dept);
    /**
     * æž„建前端所需要树结构
     * 
     * @param depts éƒ¨é—¨åˆ—表
src/main/java/com/ruoyi/project/system/service/ISysMenuService.java
@@ -37,6 +37,14 @@
     * @return æƒé™åˆ—表
     */
    public Set<String> selectMenuPermsByUserId(Long userId);
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    public Set<String> selectMenuPermsByRoleId(Long roleId);
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单树信息
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
@@ -47,6 +47,19 @@
    {
        return deptMapper.selectDeptList(dept);
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     *
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return éƒ¨é—¨æ ‘信息集合
     */
    @Override
    public List<TreeSelect> selectDeptTreeList(SysDept dept)
    {
        List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        return buildDeptTreeSelect(depts);
    }
    /**
     * æž„建前端所需要树结构
src/main/java/com/ruoyi/project/system/service/impl/SysMenuServiceImpl.java
@@ -101,6 +101,27 @@
    }
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectMenuPermsByRoleId(Long roleId)
    {
        List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
        Set<String> permsSet = new HashSet<>();
        for (String perm : perms)
        {
            if (StringUtils.isNotEmpty(perm))
            {
                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
            }
        }
        return permsSet;
    }
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     * 
     * @param userId ç”¨æˆ·åç§°
src/main/resources/mybatis/system/SysMenuMapper.xml
@@ -111,6 +111,13 @@
        where m.status = '0' and r.status = '0' and ur.user_id = #{userId}
    </select>
    
    <select id="selectMenuPermsByRoleId" parameterType="Long" resultType="String">
        select distinct m.perms
        from sys_menu m
             left join sys_role_menu rm on m.menu_id = rm.menu_id
        where m.status = '0' and rm.role_id = #{roleId}
    </select>
    <select id="selectMenuById" parameterType="Long" resultMap="SysMenuResult">
        <include refid="selectMenuVo"/>
        where menu_id = #{menuId}