前章讲了如何进行用户权限验证《SpringCloud下的用户鉴权方案》,它是微服务下统一资源访问权限的控制,就像一道墙保护着SpringCloud
集群下的各个业务应用服务。而本章要讲的是权限控制的另一个层面数据权限
,意思是控制可访问数据资源的数量。
举个例子:
有一批业务员跟进全国的销售订单。他们被按城市进行划分,一个业务员跟进3个城市的订单,为了保护公司的业务数据不能被所有人都掌握,故每个业务员只能看到自己负责城市的订单数据。所以从系统来讲每个业务员都有访问销售订单的功能,然后再需要配置每个业务员负责的城市,以此对订单数据进行筛选。
要实现此功能有很多方法,如果系统中多个地方都需要类似的需求,那我们就可以将其提出来做成一个通用的功能。这里我介绍一个相对简单的解决方案,以供参考。
一、 整体架构
![7633484c9d36a54f5fcb1db015c175e5.png](https://i-blog.csdnimg.cn/blog_migrate/a7760e8d7f6ff5d6395b3e92724cdd9e.png)
数据权限
为作一个注解
的形式挂在每一个需要数据权限控制的Controller上,由于和具体的程序逻辑有关故有一定的入侵性,且需要数据库配合使用。
二、 实现流程
![c53f663415b9a844a2efdf7c966af77a.png](https://i-blog.csdnimg.cn/blog_migrate/d3352c9c9cf0d98af71c0fe4d28fa704.png)
- 浏览器传
带查询权限范围参数
访问Controller,如cities
POST http://127.0.0.1:8000/order/query
accept: */*
Content-Type: application/json
token: 1e2b2298-8274-4599-a26f-a799167cc82f
{"cities":["cq","cd","bj"],"userName":"string"}
- 通过注解拦截权限范围参数,并根据预授权范围比较,回写在授权范围内的权限范围参数
cities = ["cq","cd"]
- 通过参数传递到DAO层,在SQL语句中拼装出查