目录

后端代码分析

Controller层

自定义注解

xml层 


后端代码分析

数据筛选涉及到spl文件,可以通过AOP类以及注解来完成操作,也就是数据筛选。

Controller层

那么首先是Controller层,从一个数据分页接口开始吧

@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(SysUser user)
{
    startPage();
    List<SysUser> list = userService.selectUserList(user);
    return getDataTable(list);

}

这个数据分页接口调用Service层中selectUserList函数,然后在selectUserList函数那里有一个注解。

@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user)
{
    return userMapper.selectUserList(user);
}

也就是@DataScope(deptAlias = "d", userAlias = "u")

这是个自定义注解

自定义注解

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

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

  再往下翻,可以看到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);
    }

其中有一个函数值得在意,函数clearDataScope

函数clearDataScope判断传入参数是否为BaseEntity的子类,从而防止SQL注入

  private void clearDataScope(final JoinPoint joinPoint)
    {
        Object params = joinPoint.getArgs()[0];
        if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
        {
            BaseEntity baseEntity = (BaseEntity) params;
            baseEntity.getParams().put(DATA_SCOPE, "");
        }
    }

这样一来,就可以开始识别数据权限以及设置

xml层 

最终在xml层中调用

 

Logo

快速构建 Web 应用程序

更多推荐