记录数据权限实现

这篇文章主要是用于总结并记录一下项目中数据权限的实现。

项目中是根据用户所属的组织,项目进行数据的过滤,项目是属于组织树的子级,所以项目中是用注解,对于需要进行数据权限控制的接口进行sql的拼接来实现数据过滤。

项目中先自定义一个注解

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface DataPermission {

   
}

只要在接口上加上注解(对数据权限控制过滤到项目)

@DataPermission()

注解写完之后需要用到aop对注解前后进行一个处理来实现数据权限的设置

@Slf4j
@Aspect
@Component
public class DataPermissionAspect {

    @Autowired
    private RedisUtil redisUtil;

    @Pointcut("@annotation(com.els.common.system.permission.annotation.DataPermission)")
    public void pointCut() {

    }

    @Around("pointCut() && @annotation(dataPermission)")
    public Object around(ProceedingJoinPoint point, DataPermission dataPermission) throws Throwable {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
        String token = httpServletRequest.getHeader("X-Access-Token");

        //可根据token获取当前登录用户信息
        String account = "xxx";
        //用登录人的账号作为key,从redis中获取当前登录人的数据权限信息
        String key = CommonConstant.SYS_DATA_PERMISSION + account;
        DataPermissionDto dataPermissionDto = (DataPermissionDto) redisUtil.get(key);
        // 如果redis查不到当前登录人的数据权限信息,则查询当前用户数据权限并设置到缓存中
        if (dataPermissionDto == null) {
            String elsAccount = "";
            String subAccount = "";
            //根据登录人账号,查询数据权限表,设置到DataPermissionDto对象中存到redis
            xxx.setDataPermission(elsAccount, subAccount);

            dataPermissionDto = (DataPermissionDto) redisUtil.get(key);
        }

        log.info("EVENT=设置当前用户的数据权限|dataPermissionDto={}", JSON.toJSONString(dataPermissionDto));

        try {
            return point.proceed();

        } finally {
            DataPermissionUtil.clear();
        }
    }

}

数据权限对象(DataPermissionDto):

@Data
public class DataPermissionDto implements Serializable {

    private static final long serialVersionUID = 2338797575500858916L;

    public final static Integer INNER_ACCOUNT = 0;


    /**
     * 区域编码列表
     */
    private List<String> orgCodeList;


    /**
     * 项目编码列表
     */
    private List<String> projectCodeList;


}

数据权限表里有用户信息字段和组织项目信息字段,可根据用户查询到用户的所有组织或项目信息。

以上就可以根据登录人获取设置好当前登录人的数据权限信息(DataPermissionDto对象)。

然后就可以根据登录人信息从redis里获取当前登录人的数据权限信息,对接口查询的sql加上过滤参数实现数据权限过滤。

以上就是数据权限的一些基本思路,实际项目中并不止这么简单。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您在JeecgBoot项目中找不到sys-data-permission资源文件夹,可能是因为该文件夹被移动或删除了。您可以尝试在项目中搜索该文件夹,或者查看项目的配置文件,确认该文件夹是否被正确配置。 如果您无法找到该文件夹,也可以手动创建该文件夹并添加相关文件。具体操作步骤如下: 1. 在JeecgBoot项目的模块目录下创建sys-data-permission文件夹。 2. 在sys-data-permission文件夹下创建SysPermissionDataRuleController.java文件。 3. 在SysPermissionDataRuleController.java文件中添加相关代码,并保存文件。 以下是SysPermissionDataRuleController.java文件示例代码: ``` @RestController @RequestMapping("/sys/permission/dataRule") @Slf4j public class SysPermissionDataRuleController extends JeecgController<SysPermissionDataRule, ISysPermissionDataRuleService> { //添加代码 @GetMapping(value = "/list") public Result<?> list(SysPermissionDataRule sysPermissionDataRule, HttpServletRequest req) { QueryWrapper<SysPermissionDataRule> queryWrapper = QueryGenerator.initQueryWrapper(sysPermissionDataRule, req.getParameterMap()); //按照ID升序排列 queryWrapper.orderByAsc("id"); Page<SysPermissionDataRule> page = new Page<SysPermissionDataRule>(1, 10); IPage<SysPermissionDataRule> pageList = service.page(page, queryWrapper); return Result.ok(pageList); } } ``` 在以上代码中,我们在list方法中添加了`queryWrapper.orderByAsc("id");`语句,表示按照ID升序排列。 通过以上步骤,您就可以手动创建sys-data-permission文件夹,并按照需要添加相关文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值