记录数据权限实现

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

项目中是根据用户所属的组织,项目进行数据的过滤,项目是属于组织树的子级,所以项目中是用注解,对于需要进行数据权限控制的接口进行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加上过滤参数实现数据权限过滤。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值