数据权限怎么做?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原创不易,完成人机校验,阅读全文