ruoyi数据权限与AOP类
AOP类简单分析
·
目录
后端代码分析
数据筛选涉及到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层中调用
更多推荐
所有评论(0)