若依(RUOYI)

数据权限怎么做?Springboot管理系统数据权限过滤——ruoyi实现方案

本文主要简述,Ruoyi框架使用的权限过滤实现方案,实现简单易懂。主要知识点有:注解定义;面向切面编程,在执行有数据权限注解的方法之前获取用户组织权限,拼接到domain对象的params参数中;1.注解定义ruoyi数据权限涉及部门表sys_dept和用户表sys_users表,这里仅用来定义sql查询中部门表和用户表的别名。@Target(ElementType.METHOD)@Retenti

本文主要简述,Ruoyi框架使用的权限过滤实现方案,实现简单易懂。主要知识点有:

注解定义;

面向切面编程,在执行有数据权限注解的方法之前获取用户组织权限,拼接到domain对象的params参数中;

1. 注解定义

ruoyi数据权限涉及部门表sys_dept和用户表sys_users表,这里仅用来定义sql查询中部门表和用户表的别名。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
    /**
     * 部门表的别名
     */
    public String deptAlias() default "";

    /**
     * 用户表的别名
     */
    public String userAlias() default "";

    /**
     * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
     */
    public String permission() default "";
}

2. 注解标记方法拦截后的处理

查看DataScopeAspect.class源码,添加类注解:@Aspect、@Component。

权限类型共有五种:超管全部权限(直接跳过权限过滤)、全部数据权限、自定数据权限、部门数据权限、部门及以下数据权限、仅本人数据权限。分别对五种权限进行处理。(DataScope中定义的表别名用途就在这里)

/**
 * 数据过滤处理
 *
 * @author ruoyi
 */
@Aspect
@Component
public class DataScopeAspect
{
    /**
     * 全部数据权限
     */
    public static final String DATA_SCOPE_ALL = "1";

    /**
     * 自定数据权限
     */
    public static final String DATA_SCOPE_CUSTOM = "2";

    /**
     * 部门数据权限
     */
    public static final String DATA_SCOPE_DEPT = "3";

    /**
     * 部门及以下数据权限
     */
    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";

    /**
     * 仅本人数据权限
     */
    public static final String DATA_SCOPE_SELF = "5";

    /**
     * 数据权限过滤关键字
     */
    public static final String DATA_SCOPE = "dataScope";

    @Before("@annotation(controllerDataScope)")
    public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable
    {
        clearDataScope(point);
        handleDataScope(point, controllerDataScope);
    }

    protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope)
    {
        // 获取当前的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNotNull(loginUser))
        {
            SysUser currentUser = loginUser.getUser();
            // 如果是超级管理员,则不过滤数据
            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
            {
                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
                        controllerDataScope

原创不易,完成人机校验,阅读全文

相关推荐