范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

从零开始,手打一个权限管理系统(第十章数据权限)

  前言
  这章主要讲解如何实现对表数据权限的控制,让授权用户只能看到指定范围的数据。一、实现思路
  我们用组织机构ID(org_id)来作为数据权限的过滤字段,通过对sql语句添加where条件来实现对数据的过滤;这里我们需要用到MyBatis-Plus的一个数据权限的插件DataPermissionInterceptor,通过实现自定义的数据权限处理器DataPermissionHandler,就可以满足我们在sql语句里面添加过滤条件的需求。二、主要代码
  1、自定义数据拦截器,实现DataPermissionHandler接口package com.ailot.cloud.base.data.datascope; import cn.hutool.core.collection.CollUtil; import cn.hutool.db.Db; import cn.hutool.db.Entity; import com.ailot.cloud.base.common.constants.CommonConstant; import com.ailot.cloud.base.common.exception.CheckedException; import com.ailot.cloud.base.data.enums.DataScopeTypeEnum; import com.ailot.cloud.base.security.constant.SecurityConstants; import com.ailot.cloud.base.security.model.JwtUser; import com.ailot.cloud.base.security.utils.SecurityUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler; import lombok.SneakyThrows; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.schema.Column; import org.springframework.security.core.GrantedAuthority; import javax.sql.DataSource; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class DataScopeHandler implements DataPermissionHandler { private final DataScopeProperties dataScopeProperties; private final DataSource dataSource; public DataScopeHandler(DataScopeProperties dataScopeProperties, DataSource dataSource) { this.dataScopeProperties = dataScopeProperties; this.dataSource = dataSource; } @SneakyThrows @Override public Expression getSqlSegment(Expression where, String mappedStatementId) { //查询需要配置数据权限的方法 List mapperIds = dataScopeProperties.getMapperIds(); if (CollUtil.isEmpty(mapperIds)) { return where; } else { if (!CollUtil.contains(mapperIds, mappedStatementId)) { return where; } } List orgIds = new ArrayList<>(); JwtUser user = SecurityUtils.getUser(); if (user == null) { throw new CheckedException("用户信息为空"); } //获取角色ID列表 List roleIdList = user.getAuthorities().stream() .map(GrantedAuthority::getAuthority) .filter(authority -> authority.startsWith(SecurityConstants.ROLE)) .map(authority -> authority.split("_")[1]) .collect(Collectors.toList()); // 获取角色信息 Entity query = Db.use(dataSource) .query("SELECT * FROM " + CommonConstant.UPMS_DATABASE + ".sys_role where id IN ("" + CollUtil.join(roleIdList, "","") + "")") .stream().min(Comparator.comparingInt(o -> o.getInt("ds_type"))).get(); Integer dsType = query.getInt("ds_type"); //查询全部 if (DataScopeTypeEnum.ALL.getType() == dsType) { return where; } // 自定义 if (DataScopeTypeEnum.CUSTOM.getType() == dsType) { //部门范围 String dsScope = query.getStr("ds_scope"); orgIds.addAll(Arrays.stream(dsScope.split(",")).map(String::toString).collect(Collectors.toList())); } // 只查询本级 if (DataScopeTypeEnum.OWN_LEVEL.getType() == dsType) { orgIds.add(user.getOrgId()); } ItemsList itemsList = new ExpressionList(orgIds.stream().map(StringValue::new).collect(Collectors.toList())); InExpression inExpression = new InExpression(new Column(CommonConstant.ORG_SCOPE), itemsList); return ObjectUtils.isNotEmpty(where) ? new AndExpression(where, inExpression) : inExpression; } }
  简单说一下这个代码的逻辑,首先是拿到需要数据权限拦截的方法,然后获取当前用户的角色,通过角色就可以获取到数据权限类型(ds_type);这里我们定义了三种类型的数据权限(全部、自定义、本级),全部就不用加where条件,自定义就是获取到指定范围ds_scope的数据,本级就是当前用户所在部门的数据,然后我们只需要将这些条件拼接起来,生成一个新的sql语句就可以了。
  2、配置拦截器
  要使用数据拦截器需要在Mybatis配置文件里面初始化DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor(); dataPermissionInterceptor.setDataPermissionHandler(new DataScopeHandler(dataScopeProperties, dataSource)); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //数据权限拦截 interceptor.addInnerInterceptor(dataPermissionInterceptor);
  3、在yml文件里面配置需要拦截的方法base: datascope: mapperIds: - com.ailot.cloud.upms.api.mapper.SysUserMapper.pageUser
  至此数据权限的配置就已经全部完成了,后面只需要在有拦截需求的表加上拦截字段,在yml配置文件上添加需要拦截的方法就可以实现数据权限的过滤了。三、效果展示
  当前版本tag:1.0.9
  代码仓库四、 体验地址
  后台数据库只给了部分权限,报错属于正常!
  想学的老铁给点点关注吧!!!
  欢迎留言交流!!!
  我是阿咕噜,一个从互联网慢慢上岸的程序员,如果喜欢我的文章,记得帮忙点个赞哟,谢谢!

合资理财公司遇产品发行窘境受波动市场冲击更大呼吁同业先守正再创新目前全国开业的合资理财公司一共有四家,2020年9月,东方汇理资产管理公司与中银理财合资的汇华理财正式开业,成为首家中外联姻理财公司2021年5月,贝莱德金融管理公司与建信理财合资广东下一盘大棋5个都市圈,3个省域副中心,2个省级经济中心说起经济大省,广东是首屈一指的。自从改革开放之后,广东的经济发展就如同坐了火箭,仅9年就赶超了江苏,1989年首次坐稳全国第一。01在刚刚过去的2022年中,广东的GDP总量达到了镜头精准监督护航乡村振兴今年以来,各级纪检监察机关积极开展乡村振兴领域不正之风和腐败问题专项整治,加强对重点项目重大资金重要环节的监督检查,看住国家资产集体财产,维护农民合法权益。正值春茶生产旺季,广西壮请雾必小心!永州公安交警发布雾天出行安全提示近日永州气温总体回暖昼夜温差较大大雾天气频发能见度较差极易发生道路交通事故出行安全风险增大永州公安交警提醒驾驶人朋友恶劣天气出行一定要小心驾驶,慢字当先保持安全车距,平安到家1。合郴州兄妹俩出走8天,饿了吃剩饭晚上睡旧房,民警倾力找回近日,郴州桂阳,处于学龄期的兄妹二人,因沉迷手机游戏产生厌学情绪,偷偷拿着爷爷奶奶智能手机离家出走。经公安紧急助力,兄妹俩出走8天后被成功找回。3月4日,桂阳县公安局洋市派出所接到看谁敢动台湾!秦刚在两会现场拿出宪法,祖国统一的钟声响起今年以来,美国对台湾省事务的干涉不断加强。美国政府不仅试图模糊一个中国政策,而且对是否将对台湾省进行军事干预保持模糊。日前,美国国务卿布林肯公然宣称台湾海峡问题不是中国的内政。这种春季大枣的食养妙方枸杞大枣茶本周唐茗工坊推荐的食养方,是春季适合大家日常办公冲泡的养生茶枸杞大枣茶。春季养肝的食物里,上周我们推荐了枸杞子,与枸杞共同食用的大枣健脾胃,养肝血,还能安心神。这款养生茶具有明目养在春季患者怎么预防白癜风扩散?白癜风是一种容易复发和扩散的疾病,在白癜风的日常治疗中,预防白癜风的扩散是非常重要的。只有有效地防止白癜风扩散,才能通过进一步的治疗达到临床治愈白癜风的目的。在春季患者怎么预防白癜一个24岁初老症患者的绝望自白老无所依空气里弥漫着烈日的味道周遭一片寂静昨夜天花板上嬉戏的鼠儿从容地在我面前次第爬过我很享受此情我已经老了老得只剩下病痛与记忆时光从未如此纯粹过除了呻吟,就是回忆回忆我的童年我的为什么总说,别让孩子喝饮料,尤其是糖尿病患者!很多人平时都喜欢喝饮料,尤其是儿童用饮料代替了白水。糖尿病患者首要任务就是控糖,我们日常所喝的各种饮料,尤其是碳酸饮料和调味类的果汁饮料,在调配的过程中,所含有的糖分非常大!而人体孕吐和孩子智商有关吗?有孕吐和没孕吐,出生的孩子有什么不同?今年25岁小慧是一名家庭主妇,平时就是操劳家务,照顾家里老人。最近一段时间,小慧发现自己好长时间没有来月经了,以为患上了什么疾病。于是,小慧便去了当地医院进行检查,其中血HCG显示
中国平安和员工签订代理人合同,不签订正规的劳动合同给员工买五险一金,这是怎么回事?中国平安的代理人和中国平安有关系吗?很多平安代理人就和客户说了我平安的我是平安的经理我们公司500强。特别骄傲的样子。其实,和平安只是合作的关系。代理人和平安公司隔着500道墙还要从师范大学出来的就业什么情况?我认为从师范大学毕业的学生就业方向有以下几种第一,最好是通过招考进入中小学当老师,这种一般是有编制的。特别注意,如果想考编当老师,一定要利用好应届毕业生的身份,也就是在你大四这一年西安真的比郑州教育资源好吗?你这不废话吗?西安几个985,郑州几个西安几个211,郑州几个西安几个百强高中,郑州几个西安对郑州,教育资源是压倒性胜利。我说的是事实,不服的可以找我对线。咋可能呢,西安的义务教育在郑州月薪过万的都有哪个行业?过万很容易,现在不是之前了。脑力,人际关系,家族关系,体力。举例,网络软件开发,金融理财分析师。稀有元素进出口。在就是身边骑三轮卖小吃的,在就是身边顺丰快递的负责写字楼区域的。顺丰在工作中,领导很看重你,但却晋升了别人,你该怎么办?领导器重我但晋升了别人,换做任何人,也会失去理智,有了冲进领导办公室质问领导的念头。但先别急,让我们来具体分析一下这个问题。首先,我们看一下文中重点信息1。领导器重我2。晋升了别人税务局工作怎么样?前两天刚刚与一个税务的朋友一起吃饭,听他吐槽了一晚上的税务,不一定全是真的,说出来给你参考一下首先是税务的人员多,职务晋升难。原来税务是国税和地税两家单位,人数数量都不少,后来机构很多工作有年龄限制,将近50岁的人该怎么办呢?可以做保姆,家政服务,宿舍管理,清洁工,仓库管理员,超市导购,门卫和摆摊卖菜等自由职业。守门工地守材料守仓库产品出入库登记员保安公司签约待分配到银行等单位上岗!保持身体健康比选择工你听过感人的故事吗?高奶奶的家族由于重男轻女,她出生后,她和妈妈都被家人赶出家门,妈妈带着她以乞讨为生。后来,妈妈生病走了,高奶奶成了一个孤儿。有一家人将高奶奶收养了,但没过几天,那家人又不要高奶奶了你知道哪些善有善报的故事?在我们镇上有一位老中医,我小的时候经常生病,不是今天发高烧,就是明天咳嗽的,所以我对这位老中医可谓非常熟悉,而且每次去看病他都会给我拿玩具或则零食吃。这个老中医信仰道家文化,所以可大一入学,报了四个社团,都被淘汰了,有点恐惧面试了,怎么办?加入大学好的社团竞争还是大的,我孩子就读兰州大学新闻与传播学院,报了兰大青年传媒集团与行走西北角两个社团,这两个社团在全国大学中是有一定影响力的,多次得过全国性大奖,报名时按要求网高考最辛苦最难的是哪个省?我认为高考最辛苦最难的省是江西省,江西省的孩子最苦了。为什么这样说,因为我就是江西省的,我是深有体会。一江西省的高校教育资源最贫乏教育资源最丰富的当然要数北京,上海,天津了,集中了