一种基于Mybatis拦截器实现数据行权限的方法与流程

文档序号:26843243发布日期:2021-10-08 23:39阅读:514来源:国知局
一种基于Mybatis拦截器实现数据行权限的方法与流程
一种基于mybatis拦截器实现数据行权限的方法
技术领域
1.本发明涉及数据安全技术领域,具体是一种基于mybatis拦截器实现数据行权限的方法。


背景技术:

2.如何有效地保证数据的安全,实现数据的保密性,对如今的数据库系统来说是至关重要的,因为数据库中存放着大量的数据,这些数据可供拥有一定职责和权力的用户共享。但是,很难严格的限制用户只能得到一些与他们权力相当的数据。
3.在现有很多系统中,要实现数据行级权限控制,一般是在sql中加入用户过滤条件,类似于userid=xxx,orgid in(xxx,xxx),由于现在项目大多采用mybatis,在mybatis的每个xml文件的sql中都要去加入这个条件,这样的方式有一定的局限性,而且侵入性过大,对于已实现的功能都需要做改造,工作量也很大,在mybatis中执行sql的过程都能通过拦截器进行拦击,比如现有的分页是通过拦击sql先执行count,在对sql进行重写分页参数而实现。


技术实现要素:

4.本发明的目的在于提供一种基于mybatis拦截器实现数据行权限的方法,以解决上述背景技术中提出的问题。
5.本发明的技术方案是:一种基于mybatis拦截器实现数据行权限的方法,包括以下步骤:
6.s1、在数据库设计之初加入数据权限列字段,添加创建人、标识公司id或部门id,在数据入库时根据当前登录用信息对这两个数据进行设值;
7.s2、创建一个java自定义注解,作用到方法级别,在控制层的方法上加入该注解;
8.s3、创建spring aop切面,拦截所有请求,判断该请求是否在上述缓存中;
9.s4、创建mybatis拦截器,拦截“prepare”方法,使其在执行sql前对sql重写;
10.s5、获取当前用户标识和组织id,在配置文件配置用户id和组织id获取的java方法。
11.优选的,所述步骤s3中若需要处理数据权限,则获取用户权限配置添加到当前线程中,所述当前线程包括有获取权限配置时,根据用户授权类型组装授权参数、将组装的授权信息存入redis缓存中,使得下次使用时不需要重新查询和组装和在用户对数据权限重新配置后,获得最新的权限配置,将该缓存重新写入。
12.优选的,所述授权类型包括有自己、本公司、本部门、本公司及下属公司、本部门及下属部门、自定义和全部数据。
13.优选的,所述步骤s4中拦截器的方法包括有获取当前线程是否存在权限配置数据、检查sql类型是否为select类型、获取原始sql,根据权限配置检查是否存在创建人或组织id在sql中追加where条件和将重写后带有数据权限的sql重新设置回mybatis,使得在查
询时使用该sql语句。
14.优选的,所述步骤s5中的配置用户id和组织id获取的java方法为利用java反射机制执行配置方法,获取用户标识和组织id。
15.本发明通过改进在此提供一种基于mybatis拦截器实现数据行权限的方法,与现有技术相比,具有如下改进及优点:
16.其一:本发明不仅能够降低sql与项目耦合性,使得开发人员在开发过程中只关注业务实现,而且提供灵活的数据行权限配置方式,满足企业或用户的多样化需求,能够增加数据行权限,使得更精细化的控制数据的访问权限,提升数据的安全性;
17.其二:本发明不仅利用注解机制扫描和拦截请求,可控数据项配置由系统默认实现,减少人工繁琐操作,利用懒加载模式将授权信息缓存,提高系统数据处理速度,同时还能使得权限变更时及时刷新缓存,使得配置能实时生效,使用主流框架进行集成实现,降低学习成本的同时也能满足更多项目要求。
附图说明
18.下面结合附图和实施例对本发明作进一步解释:
19.图1是本发明的数据行权限的方法流程图;
20.图2是本发明的数据行权限的方法的拓扑图。
具体实施方式
21.下面对本发明进行详细说明,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
22.本发明通过改进在此提供一种基于mybatis拦截器实现数据行权限的方法,本发明的技术方案是:
23.实施例一:
24.如图1

图2所示,本发明的技术方案是:一种基于mybatis拦截器实现数据行权限的方法,包括以下步骤:
25.s1、在数据库设计之初加入数据权限列字段,添加创建人、标识公司id或部门id,在数据入库时根据当前登录用信息对这两个数据进行设值;
26.s2、创建一个java自定义注解,作用到方法级别,在控制层的方法上加入该注解;
27.s3、创建spring aop切面,拦截所有请求,判断该请求是否在上述缓存中;
28.s4、创建mybatis拦截器,拦截“prepare”方法,使其在执行sql前对sql重写;
29.s5、获取当前用户标识和组织id,在配置文件配置用户id和组织id获取的java方法。
30.进一步的,在上述技术方案中,所述步骤s3中若需要处理数据权限,则获取用户权限配置添加到当前线程中,所述当前线程包括有获取权限配置时,根据用户授权类型组装授权参数、将组装的授权信息存入redis缓存中,使得下次使用时不需要重新查询和组装和在用户对数据权限重新配置后,获得最新的权限配置,将该缓存重新写入。
31.进一步的,在上述技术方案中,所述授权类型包括有自己、本公司、本部门、本公司及下属公司、本部门及下属部门、自定义和全部数据。
32.进一步的,在上述技术方案中,所述步骤s4中拦截器的方法包括有获取当前线程是否存在权限配置数据、检查sql类型是否为select类型、获取原始sql,根据权限配置检查是否存在创建人或组织id在sql中追加where条件和将重写后带有数据权限的sql重新设置回mybatis,使得在查询时使用该sql语句。
33.进一步的,在上述技术方案中,所述步骤s5中的配置用户id和组织id获取的java方法为利用java反射机制执行配置方法,获取用户标识和组织id。
34.工作原理:首先在数据库设计之初加入数据权限列字段,添加创建人、标识公司id或部门id,在数据入库时根据当前登录用信息对这两个数据进行设值,然后创建一个java自定义注解,作用到方法级别,在控制层的方法上加入该注解,系统启动时扫描所有请求映射,将有该注解的所有访问链接缓存,便于后续使用,然后创建spring aop切面,拦截所有请求,判断该请求是否在如上述缓存中,若需要处理数据权限,则获取用户权限配置添加到当前线程中,否则直接放行执行方法,当获取权限配置时,根据用户授权类型组装授权参数,授权类型包括有自己、本公司、本部门、本公司及下属公司、本部门及下属部门、自定义和全部数据,将组装的授权信息存入redis缓存中,使得下次使用时不需要重新查询和组装和在用户对数据权限重新配置后,获得最新的权限配置,将该缓存重新写入,然后创建mybatis拦截器,拦截“prepare”方法,使其在执行sql前对sql重写,方法包括有获取当前线程是否存在权限配置数据、检查sql类型是否为select类型、获取原始sql,根据权限配置检查是否存在创建人或组织id在sql中追加where条件和将重写后带有数据权限的sql重新设置回mybatis,若当前线程不存在权限配置数据则直接放行,否则执行下一步,若检查sql类型不为select类型,则直接放行,否则执行下一步,根据权限配置检查是若不存在创建人或组织id在sql中追加where条件,则直接放行,否则执行下一步,使得在查询时使用该sql语句,最后获取当前用户标识和组织id,在配置文件配置用户id和组织id获取的java方法,配置用户id和组织id获取的java方法为利用java反射机制执行配置方法,获取用户标识和组织id,从而不仅能够降低sql与项目耦合性,使得开发人员在开发过程中只关注业务实现,而且提供灵活的数据行权限配置方式,满足企业或用户的多样化需求,能够增加数据行权限,使得更精细化的控制数据的访问权限,提升数据的安全性,利用注解机制扫描和拦截请求,可控数据项配置由系统默认实现,减少人工繁琐操作,利用懒加载模式将授权信息缓存,提高系统数据处理速度,同时还能使得权限变更时及时刷新缓存,使得配置能实时生效,使用主流框架进行集成实现,降低学习成本的同时也能满足更多项目要求。
35.上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1