为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

java-数据权限控制-数据权限-数据列权限设计方案

2023-06-19 5页 doc 23KB 34阅读

用户头像 个人认证

is_859878

暂无简介

举报
java-数据权限控制-数据权限-数据列权限设计方案  java数据权限控制数据权限-数据列权限设计方案  前言项目实践中,基本都会有权限的需求,权限需求分为两大块:1、功能权限;2、数据权限。而数据权限又可在行和列上细分为两块,即数据范围权限:用户能看到哪些行的记录;数据字段权限:用户能看到这些行对应的哪些字段。本文以字段权限为例做一个demo展示。方案字段权限方案也有很多种,这里采用配置无权限字段,在sql查询前,对sql进行拦截过滤,剔除无权限字段。框架这里采用mybatis作为ORM框架。配置配置pom依赖org.mybatis.spring.bootmybatis-s...
java-数据权限控制-数据权限-数据列权限设计方案
  java数据权限控制数据权限-数据列权限  前言项目实践中,基本都会有权限的需求,权限需求分为两大块:1、功能权限;2、数据权限。而数据权限又可在行和列上细分为两块,即数据范围权限:用户能看到哪些行的;数据字段权限:用户能看到这些行对应的哪些字段。本文以字段权限为例做一个demo展示。方案字段权限方案也有很多种,这里采用配置无权限字段,在sql查询前,对sql进行拦截过滤,剔除无权限字段。框架这里采用mybatis作为ORM框架。配置配置pom依赖org.mybatis.spring.bootmybatis-spring-boot-starter2.0.0com.github.jsqlparserjsqlparser1.2yml配置spring:proifles:dev#据源配置datasource:name:testurl:jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghaiusername:rootpassword:xxx#使用druid数据源type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.jdbc.Driver#注意:一定要对应mapper映射xml文件的所在路径mybatis:mapper-locations:classpath:mybatis/mapper/*.xml#注意:对应实体类的路径type-aliases-package:com.xxx.model#mybatis配置路径config-location:classpath:mybatis/mybatis-config.xmlplugin配置配置mybatis-config.xml/p>"http://mybatis.org/dtd/mybatis-3-config.dtd">插件实现importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.Properties;importorg.apache.ibatis.executor.Executor;importorg.apache.ibatis.mapping.BoundSql;importorg.apache.ibatis.mapping.MappedStatement;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.plugin.Intercepts;importorg.apache.ibatis.plugin.Invocation;importorg.apache.ibatis.plugin.Plugin;importorg.apache.ibatis.plugin.Signature;importorg.apache.ibatis.session.ResultHandler;importorg.apache.ibatis.session.RowBounds;importnet.sf.jsqlparser.JSQLParserException;importnet.sf.jsqlparser.parser.CCJSqlParserUtil;importnet.sf.jsqlparser.statement.Statement;importnet.sf.jsqlparser.statement.Statements;importnet.sf.jsqlparser.statement.select.PlainSelect;importnet.sf.jsqlparser.statement.select.Select;importnet.sf.jsqlparser.statement.select.SelectBody;importnet.sf.jsqlparser.statement.select.SelectExpressionItem;importnet.sf.jsqlparser.statement.select.SelectItem;//指定连接的方法@Intercepts(@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}))publicclassDataAuthorInterceptorimplementsInterceptor{privatePropertiesproperties;@OverridepublicObjectintercept(Invocationinvocation)throwsThrowable{finalObject[]args=invocation.getArgs();MappedStatementms=(MappedStatement)args[0];ObjectparameterObject=args[1];BoundSqlboundSql=ms.getBoundSql(parameterObject);//获取初始sqlStringoriginSql=boundSql.getSql();//修改sqlStringchangeSql=parseSql(originSql);Fieldfield=boundSql.getClass().getDeclaredField("sql");field.setAccessible(true);field.set(boundSql,changeSql);returninvocation.proceed();}//解析SQL,根据数据权限,去除没有权限的字段privateStringparseSql(Stringsql){ListblockList=getBlockCols();StringBuffernewSql=newStringBuffer();try{//解析sql获得结构化statementStatementss=CCJSqlParserUtil.parseStatements(sql);//对每一个statementfor(Statementst:s.getStatements()){if(null!=st){//查询sql处理if(stinstanceofSelect){SelectBodyselectBody=((Select)st).getSelectBody();if(selectBodyinstanceofPlainSelect){Iteratorit=((PlainSelect)selectBody).getSelectItems().iterator();//遍历查询字段while(it.hasNext()){SelectItemsi=it.next();if(siinstanceofSelectExpressionItem){for(Stringstr:blockList){//查询字段同权限隐藏字段匹配则从查询中移除if(si.toString().contains(str)){it.remove();}}}}}//return((Select)st).getSelectBody().toString();}newSql.append(st+";");}}}catch(JSQLParserExceptione){e.printStackTrace();}returnnewSql.toString();}//解析sql结构体privateListgetBlockCols(){Listl=newArrayList();l.add("a");l.add("b1");returnl;}@OverridepublicObjectplugin(Objecttarget){returnPlugin.wrap(target,this);}@OverridepublicvoidsetProperties(Propertiesproperties){this.properties=properties;}publicstaticvoidmain(String[]args){Stringsql="selecta,b,cfromtable1";Stringsql2="selecta,b,cfrom(selecteasa,fasb,gascfromtable1)";Stringsql3="selectaasa1,bb1,cfromtable3ast3,(selecteasa,fasbfromtable1),(selectgascfromtable2)";Stringsql4="selectc.vin8,(selectauto_brandfromvin_basebwhereb.vin8=c.vin8)\n"+"fromvin_basecwherec.vin8='72753413'";Stringsql5="selecta,bfromtable1unionselectc,dfromtable2;";StringchangeSql=newDataAuthorInterceptor().parseSql(sql5);System.out.println("changeSql>>>>>>>>"+changeSql);}}到这里,完成了对sql的拦截修改。1、配置:pom.xml依赖配置、yaml应用配置、插件配置、插件实现。2、以上示例仅对一般查询及子查询做了处理,对与union查询,需要再实现。拦截处理,是一种很好的设计思路,可以对相同处理方式进行组件化,并在应用中,避免侵入式,从而做到润物无声。本文地址:https://blog.csdn.net/weixin_42005602/article/details/107151625如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑! -完-
/
本文档为【java-数据权限控制-数据权限-数据列权限设计方案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索