接口权限控制
接口权限控制分为接口访问权限和接口数据权限,主要是用于系统的安全、用户个性化等方面。
接口访问权限
就是控制调用方是否有调用这个接口的权限。
调用方大致可以分为
- 在浏览器上访问网站的正常用户。
- 内部互相调用的微服务。
- 拿postman进行开发测试的程序员。
- 用python等各种手段暴力破解你系统的黑客。
根据调用方和业务划分出八个不同的权限
- 无限制:任何人都可以调用,没有任何限制,例:管理员|用户|租户成员登录,首页业务请求等。
- 内部调用:只能服务间调用,外部无法进行访问。
- 管理员|用户|租户成员登录访问:只要登录就能访问,用于多个页面公用的接口,例:查询字典接口。
- 管理员|用户|租户成员授权访问:用于必须有接口对应的授权信息才能访问的接口,例:如增删改等。
访问权限的配置:
无限制、内部调用、登录访问:在运维后台微服务接口管理页面( http://ip:port/operate/appApiAccessAuth ),由管理员手动进行配置。
授权访问:根据管理员|用户|租户成员的授权的机构->机构授权的角色->角色绑定的菜单,来进行自动配置。
授权访问校验逻辑:
根据请求页面地址(从请求头中取Referer进行截取)校验用户是否拥有该页面访问权限,再校验在该页面下是否拥有该接口的权限。
为啥弄这么复杂,因为同一个接口,可能在A页面进行调用,也可能在B页面也进行调用,这个时候还要对其分别进行权限的控制。
进行权限校验和拦截的微服务 /server/gateway
,所有的外部请求都通过gateway
进行转发,除gateway
外,所有内部接口都不对外开放。
访问权限校验拦截实现类com.nodecollege.cloud.filterFactory.NCGatewayFilterFactory
接口数据权限
用于控制调用方调用这个接口时,能操作的数据信息。只有接口访问权限为授权访问的接口,才可以进行数据权限的控制。
数据权限其实很宽泛,得看具体的业务逻辑,目前实现的数据权限的维度:1.机构数据,2.个人数据。后期根据业务可能添加其他的维度,如数据库、数据表、职位、地区、服务器、git地址等。
维度不可控、入参出参数据结构不可控、业务逻辑不可控,所以很难在gateway上面统一进行拦截和处理,我这只能是提供一个能快速获取数据权限配置的功能,具体数据权限的校验处理逻辑,由各个接口自行控制。
对于有前端进行数据权限控制的业务来说,session中菜单树中的orgCodeList即为授权访问的机构数据,为null时,只能操作用户自己的数据。
对于后端接口要实现数据权限控制来说同理,只需获取登录用户授权菜单树orgCodeList中的值即可
数据权限的配置:
在角色管理,对具体的角色进行设置。