sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...

Spring Cloud微服务架构中的数据权限DataPermision实现方案

一、出现原因

在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermision。菜单权限主要用于控制用户角色所能访问的菜单以及页面按钮的显示与否,而数据权限则控制业务数据显示当前公司,还是所有公司,还是当前公司及其子公司的数据。

近几年Java项目中,数据中台也解决了部分数据权限问题,本文来讲解下几种DataPermision数据权限实现方案。

二、核心问题

DataPermision的主要问题在于查询性能、授权、鉴权以及字段级别的控制。

例如在百万级别的微服务Spring Cloud架构数据规模,mysql如何实现秒级别的查询?

百万级别的权限DataPermision如何授予用户?

如何快速高效的进行数据鉴权?

怎样实现字段级别的权限控制?

三、权限模型的核心抽象

先列出一张图,介绍权限模型的核心概念:

b2b749d390176bc75bee8943e4c72ea0.png

根据上图权限分析可以分析,能够观察到以下几个元素,只要是:权限实体、部门、角色、菜单权限。

菜单权限:用于控制能显示哪些菜单,以及页面按钮的显示权限。

权限实体:本部分是DataPermision模型的核心元素,也就是我们需要系统进行控制的数据。例如:Customer客户、Order订单,渠道,区域等。

Dept部门:也就是一般意义上的部门组织结构。

角色Role:用于进行抽象的实体,用来进行快速分配权限相同权限给一批用户,与菜单权限中的角色概念一致。

四、权限DataPermision的查询模型

根据上面的权限模型图,列出一条sql:

select xxx from xx_table where account in (xxx) and product_group in (xxx) and country in (xxx)

这就是这个模型的查询模型。其中account,product_group,country代表需要做权限控制的权限实体。

在这里只是一个简单的模型,如果account或者country等数据量足够大时,可以发现mysql in查询是会出现非常严重的查询性能的。比如account数据量规模为100万级别时。

4.1引入部门组织结构,突破数据量的限制

还是依赖于Spring Cloud DataPermision模型图,我们有一个部门组织结构,我们可以想象下:例如总经理,自然是能够查看所有部门的数据。比如A部门经理,可以查看A部门和他们的子部门的数据权限。如果是普通的员工,只能查看自己账号下面的数据。

我们给出一个部门的微服务组织结构图,给每个部分标志一个key,key的生成规则:

1.根部门的key为数字10

2.根部门的直属部门的key为10 001,10 002,10 003...以此类推

3.其他的key生成逻辑和步骤2相同,唯一不同的就是key的长度变长了,比如:10 001 001,10 001 002

我们给部门贴上下面的key:

4337a395528cbce9af227cfe5e48ac3c.png

有了该模型,我们结合mysql的前置查询索引的特性(dept like 'xxxx%')

where dept like '10%'

dept like '10001%'

dept like '10002%'

上面的查询,在mysql下,300万的数据规模,可以实现1S内响应!!!

4.2怎样授权

查询性能问题解决之后,授权也就是可以解决了。

授权我们一般根据员工的岗位来设定,普通员工,部门经理

普通员工:不需要单独授权,直接绑定员工工号即可

部门经理:设置该员工可以查看的部门(支持多个)

4.3怎样鉴权

进行鉴权和来自授权一般是相互的一个过程

1.判断该员工是否为使用的部门经理

2.如果是,取出部门权限的key

3.添加到sql中,使用mysql前置like查询数据

4.4数据库的实现

1.识别权限实体

2.给权限实体加上一个工号字段,一个部门字段,比如:emp_no,dept_no

3.查询时,先获取员工的角色权限,如果是部门经理,那么获取对应的key列表

4.构建sql,加入部门或者工号的sql片段:

dept_no like '10 001%' or dept_no like '10 002%',这是部门的sql

emp_no = 'xxx',这是普通员工的sql

五、总结

Spring Cloud微服务架构中还需要识别出权限实体,进行控制的数据。还需要注意数据库索引的结合。易于扩展。

本文所介绍的方法易于在微服务架构扩展,易于进行权限控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科学计数法详解

1.4013E-45 1.4013 * 10 的 -45 次方 1.4013 * 10 的 45 次方的倒数 1.4013 * 10 的 45 次方分之一 1.4013 * 1/10 的 45 次方。 算术表达式:1.4013E-45 1.4013 * 10−4510^{-45}10−45 1.4013 * 11045\frac{1}{10^{45}}10451​ 1.4013 * (110)45(\frac{1}{…

程序中抛出空指针异常_从Java应用程序中消除空指针异常

程序中抛出空指针异常这篇文章简要介绍了Java 8的最有用但又“毫不夸张”的功能。 程序员花费了无尽的时间来纠正最常见但最危险的错误之一,即Null指针异常。 空指针异常会导致我们的应用程序意外中断,并且很难预先检测到。 在许多情况下,…

python token post403原因_Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法...

Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误解决方法1:注释掉此段代码,即可。缺点:导致Django项目完全无法防止csrf攻击解决方法2&…

BigDecimal详解

文章目录为什么要使用BigDecimal构造方法加减乘除舍入模式(对BigDecimal进行截取)取余数比较大小BigDecimal 转 StringBigDecimal与double和int转换格式化显示 BigDecimal使用DecimalFormat使用String.format()总结为什么要使用BigDecimal double类型的…

java序列化和反序列化_Java恶意序列化背后的历史和动机

java序列化和反序列化与Java的序列化机制相关的问题已广为人知。 有效的Java 1st Edition (第10章)和有效的Java 2nd Edition (第11章)的整个最后一章都专门讨论Java的序列化主题。 Effective Java 3rd Edition (第12章…

python元祖迭代_如何在Python中迭代元组的堆栈

我尝试在Python中使用预定义为的DepthFirstSearch类实现DepthFirstSearch算法:class Stack:def __init__(self):self.list []def push(self,item):self.list.append(item)def pop(self):return self.list.pop()def isEmpty(self):return len(self.list) 0我还有一…

Request的学习笔记(属Servlet学习课程)

文章目录获取请求消息数据1.获取请求行的数据2.获取请求头的数据3.获取请求体的数据4.获取其它的数据4.1.获取请求参数的通用方式中文乱码问题4.2.请求转发4.3.共享数据4.4.获取 ServletContext 对象继承与实现体系浏览器访问服务器时,会将用户提交的参数数据、协议…

aws lambda_AWS Lambda事件源映射:使您的触发器混乱无序

aws lambda最近,我们为Sigma Cloud IDE上的无服务器项目引入了两个新的AWS Lambda事件源(触发类型): SQS队列和DynamoDB流 。 (是的,AWS在几个月前就向他们介绍了;但是我们仍然是一个很小的团队…

python curl模块_python pycurl模块

一、pycurl概述PycURl是一个C语言写的libcurl的python绑定库。libcurl 是一个自由的,并且容易使用的用在客户端的 URL 传输库。它的功能很强大,在PyCURL的主页上介绍的支持的功能有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and …

MySQL数据库创建用户root@%

步骤: 以 rootlocalhost 登录数据库,即先登录数据库所在的主机,再以 root 用户登录数据库: [roothtlwk0001host ~]# mysql -uroot -p123456必须先删除原来的 root% 用户: mysql> drop user root%; Query OK, 0 r…

第三方工具监控java进程_前9个免费的Java进程监视工具以及如何选择一种

第三方工具监控java进程这样就可以运行Java代码了。 也许它甚至可以在生产服务器上运行。 当您做好工作后,我们得到了好消息和令人讨厌的消息。 令人讨厌的消息是,现在开始调试。 就是进行调试和应用程序性能监视。 这意味着您不仅需要查看编写的代码&a…

python中的numpy函数算相关系数_NumPy ufunc通用函数

NumPy 提供了两种基本的对象,即 ndarray 和 ufunc 对象。前面几节已经介绍了 ndarray,本节将介绍 Numpy。ufunc 是 universal function 的缩写,意思是“通用函数”,它是一种能对数组的每个元素进行操作的函数。许多 ufunc 函数都是…

MySQL 8.x 以前的版本修改密码规则

查看密码相关变量: mysql> show variables like validate_password%; ---------------------------------------------- | Variable_name | Value | ---------------------------------------------- | validate_password_dictionary_f…

aws mfa 认证_如何为您的AWS账户设置多因素身份验证(MFA)

aws mfa 认证第1步 : 转到AWS控制台并使用您的用户名密码登录。 第2步 : 转到服务-> IAM 第三步: 单击您的根帐户上的激活MFA 第4步 : 在步骤3中,点击屏幕上的管理MFA按钮。 步骤5: 单击分配…

python具体工作内容_有没有人知道公司里用python工作的内容有什么

2018-07-11 回答python的特色 简单 python是一种代表简单主义思想的语言。阅读一个良好的python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。 …

如何导入hadoop源码到eclipse

需要进一步学习hadoop、需要看看内部源码实现,因此需要将hadoop源码导入都eclipse中。 简单总结一下,具体步骤如下: 首先确保已经安装了git、maven3、protobuf2.5、如果没有安装需要提前安装一下 0、preliminary linux distribution(我的…

线程池的学习

文章目录线程池原理JDK 1.5 之后提供的线程池工厂类线程池的使用步骤线程池原理 1.创建多个线程对象,存放到集合中,集合可以是 ArrayList 或者 LinkedList 2.从集合中取出一个线程对象,执行指定的任务 3.一个线程对象只能执行一个任务&#…

javafx 界面_JavaFX的科幻用户界面第1部分

javafx 界面使用JavaFX创建的Sci-Fi UI成形窗口 虚构的UI可以变成现实吗? 成长于80年代的小时候,我看到了自己的科幻电影,这确实激发了我对图形用户界面(GUI)的热爱,尤其是试图使科幻UI在现实世界中成为可…

token验证_如何利用 C# 爬取带 Token 验证的网站数据?

在对文本数据的情感分析中,基于情感词典的方法是最简单也是最常用的一种了。它的大体思路如下:对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和…

hadoop2.6.0+eclipse配置

【0】安装前的声明 0.1) 所用节点2个 master : 192.168.119.105 hadoop5 slave : 192.168.119.101 hadoop1 (先用一个slave,跑成功后,在从master分别scp到各个slaves即可】) 0.2) 每个机子的那些个文件…