【微服务】Nacos 账号权限体系

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用ChatGPT,微信支付,扫码加群

点击这里预览

🍅开源项目免费哦(有vue2与vue3版本):  点击这里克隆或者下载    🍅

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》

https://blog.youkuaiyun.com/qq_57756904/category_12173599.html

uniapp小程序《100套》
https://blog.youkuaiyun.com/qq_57756904/category_12199600.html

目录

一、背景

1、账号体系

2、账号实体映射

二、方案

1、Nacos 资源模型

2、Nacos 授权 resource

2.1、授权 resource 组成

2.2、不同级别授权资源组成

3、Nacos 授权 Opers

4、Nacos 具体权限定义

4.1、Opers 组成

4.2、具体实例

4.3、工程实现

三、RBAC 设计实现

1、RBAC 账号权限组成

1.1、角色

1.2、默认账号

1.3、账号体系映射

2、身份识别

2.1、身份识别分类

2.2、账号区别

💖微服务实战

💖 Spring家族及微服务系列文章 


一、背景

为了 Nacos 提升安全能力,更好满足生产要求,需要设计账号权限体系,又要能兼容云上和阿里内部场景。避免后续代码无法融合。 这块的挑战是要做好抽象,不然没法和不同账号权限体系打通。默认我们提供⼀个简单的实现,当有类似于 RAM 这样的权限体系后,直接对接即可。

1、账号体系

目前用的比较多的是 ABAC 和 RBAC 体系。目前阿里云采用 ABAC 体系,阿里内部采用 RBAC体系。无论哪个体系,最终都是让账号有有限资源的权限,已达到访问控制的目的。不同的是关联的方法,相同的都是抽象好 Nacos 的 Resource 和 Opers 。鉴权模块可以抽象可插拔,实现两种都可以支持。

2、账号实体映射

实体阿里云账号阿里内 Dauth开源
公司公司账号⼀个 admin 账号
业务域(BU,
产品线)
用户组CMDB 打通做
封网
APP(程序和
负责人)
子账号(程序账号和人账号)Dauth 应用账
普通账号+角色
环境namespace同左同左
资源acs:config:region:namespace:group同左同左

二、方案

1、Nacos 资源模型

2、Nacos 授权 resource

namespace+group+dataId 组成某⼀个授权资源,是最细能做到的水准,但是这么细的授权粒度,会导致权限数据暴涨,有多少配置(100w),就会有多少授权数据,这样在分布式权限系统中是不能搞定的,因为要有 100w 授权数据,意味着我每个 nacos 节点要监听 100w 个权限数据。因此权限管控粒度在实际生产环境,只能控制到 group 级别。namespace+group。或者 namespace 级别。

2.1、授权 resource 组成

acs:config:region:namespace:group
acs: access controller system 缩写
config:产品名或者模块名
region:区域
namespace:命名空间
group:分组

2.2、不同级别授权资源组成

授权⼀个命名空间下所有数据权限
acs:config:region:namespace:* 授权多个命名空间下⼀个分组权限
acs:config:region:*:group

3、Nacos 授权 Opers

由于使用 nacos 本质是读写数据,监听也是⼀种为了读取的行为。因此对于具体某⼀个数据,只要区分到读或者写(w/r)即可。

4、Nacos 具体权限定义

4.1、Opers 组成

acs:config:region:namespace:group w/r

4.2、具体实例

账号
角色/策略Opers/Rule
app1app1Progressacs:config:region:namespace1:goup1 -> r
app1consoleapp1consoleProgressacs:config:region:namespace1:goup1 -> w
user1app1Devacs:config:region:namespace1:goup1 -> r
app2app2Progressacs:config:region:namespace2:goup2 -> r
app2consoleapp2consoleProgressacs:config:region:namespace2:goup2 -> w
user2app2Devacs:config:region:namespace2:goup2 -> r
user3app1Ops
app2Ops
acs:config:region:namespace1:goup1 -> w
acs:config:region:namespace2:goup2 -> w
 

4.3、工程实现

所有的数据请求,都走鉴权切面。 切面里面抽象好 spi,实现上面的鉴权行为。 不同权限模型,不同场景,插拔不同的 spi。

三、RBAC 设计实现

1、RBAC 账号权限组成

rbac 账号体系由 账号 角色 权限,三元组构成,下面介绍该体系模型下,nacos 权限模型的最佳实践。

1.1、角色

首先从角色讲起,以便把账号,权限做⼀个大致的区分。

角色实体映射⽤途权限
SystemRole系统运维工程师运维日常运维
查看系统 metrics
监控,处理报警
创建 AdminRole 的用户,或者提供开通
AdminRole 角色用户机制
AdminRole企业账号付费,创建员工账号
分配权限
自定义角色员工账号/应用账号使用产品特性使用权限范围特性

1.2、默认账号

默认账号名称角色账号ID
systemSystemRole
 
0
adminAdminRole1

1.3、账号体系映射

nacos阿里云内部
system
 
云产品账号
admin主账号
员工账号,可多个子账号(Ram 分配用户名密码)员工账号
程序账号子账号(Ram 分配 ak/sk)Dauth 分配账号及 ak/sk

2、身份识别

2.1、身份识别分类

账号类型⽤途身份识别
用户账号用于分配人管理资源用户名/密码
应用账号用于分配程序访问资源ak/sk

2.2、账号区别

应用账号与应用负责人能用⼀个账号吗?
不可以,因为人会流动,权限变动比较大。 因此⼀个应用的权限和应用开发负责人权限是分开的, 用不同的账号。 应用有开发,测试,owner,其实他们有对应应用使用资源的不同权限。因此应用 负责人与应用的权限也不对等,不能共用⼀个账号。

💖微服务实战

【微服务】SpringCloud的OpenFeign与Ribbon配置

集Oauth2+Jwt实现单点登录

Spring Cloud Alibaba微服务第29章之Rancher

Spring Cloud Alibaba微服务第27章之Jenkins

Spring Cloud Alibaba微服务第24章之Docker部署

Spring Cloud Alibaba微服务第23章之Oauth2授权码模式

Spring Cloud Alibaba微服务第22章之Oauth2

Spring Cloud Alibaba微服务第21章之分布式事务

Spring Cloud Alibaba微服务第18章之消息服务

Spring Cloud Alibaba微服务第16章之服务容错

Spring Cloud Alibaba微服务第14章之分库分表

Spring Cloud Alibaba微服务第11章之MyBatis-plus

Spring Cloud Alibaba微服务第8章之OpenFeign

Spring Cloud Alibaba微服务第7章之负载均衡Ribbon

SpringCloud Alibaba微服务第6章之Gateway

SpringCloud Alibaba微服务第4章之Nacos

SpringCloud Alibaba微服务开篇

💖 Spring家族及微服务系列文章 

【Spring】一文带你吃透IOC容器技术

【微服务】SpringCloud中OpenFeign请求处理及负载均衡流程

【微服务】SpringCloud中Ribbon的WeightedResponseTimeRule策略

【微服务】SpringCloud中Ribbon的轮询(RoundRobinRule)与重试(RetryRule)策略

【微服务】SpringCloud中Ribbon集成Eureka实现负载均衡

【微服务】SpringCloud轮询拉取注册表及服务发现源码解析

【微服务】SpringCloud微服务续约源码解析

【微服务】SpringCloud微服务注册源码解析

【微服务】Nacos2.x服务发现?RPC调用?重试机制?

【微服务】Nacos通知客户端服务变更以及重试机制

【微服务】Nacos服务发现源码分析

【微服务】SpringBoot监听器机制以及在Nacos中的应用

【微服务】Nacos服务端完成微服务注册以及健康检查流程

【微服务】Nacos客户端微服务注册原理流程

【微服务】SpringCloud中使用Ribbon实现负载均衡的原理

【微服务】SpringBoot启动流程注册FeignClient

【微服务】SpringBoot启动流程初始化OpenFeign的入口

Spring Bean的生命周期

Spring事务原理

SpringBoot自动装配原理机制及过程

SpringBoot获取处理器流程

SpringBoot中处理器映射关系注册流程

Spring5.x中Bean初始化流程

Spring中Bean定义的注册流程

Spring的处理器映射器与适配器的架构设计

SpringMVC执行流程图解及源码

### Nacos中权限不足问题的原因及解决方案 #### 原因分析 Nacos中的权限控制机制可能存在配置不当的情况,从而导致权限无法正常生效。以下是可能原因: 1. **默认账户权限过高** 默认情况下,Nacos提供了`nacos/nacos`作为初始登录账号,该用户的权限过大,可能导致其他自定义用户的角色权限被忽略[^1]。 2. **鉴权功能未启用或错误配置** 如果`application.properties`文件中关于鉴权的相关参数未正确设置,则可能会导致权限验证失效。例如: - `nacos.core.auth.enable.userAgentAuthWhite=true`表示启用了通过User-Agent头来判断请求来源的白名单模式,这可能导致某些请求绕过了正常的认证流程[^3]。 3. **身份验证密钥缺失或不匹配** 配置项`nacos.core.auth.server.identity.key`和`nacos.core.auth.server.identity.value`用于指定服务器的身份标识键值对。如果这些值为空或者与其他组件不符,也可能引发权限校验失败的问题[^2]。 4. **多租户支持下的角色绑定异常** 当创建新用户并分配特定角色时,如果没有正确关联到对应的命名空间或数据集上,那么即使设置了较低级别的访问权限,在实际操作过程中仍可能出现越权现象[^4]。 #### 解决方案 针对上述提到的各种潜在因素,可以采取如下措施加以改进和完善: 1. **调整默认管理员权限** 修改默认超级管理员密码,并减少其拥有的权利范围;同时建议按照业务需求新增若干具有不同职责分工的新用户及其对应权限组。 2. **严格开启全局认证开关** 编辑`conf/application.properties`文件,确保以下几处均处于关闭状态(即false),以杜绝任何未经许可就可进入内部资源的可能性: ```properties nacos.core.auth.system.type=native nacos.core.auth.enable=true nacos.core.auth.enable.userAgentAuthWhite=false ``` 3. **设定有效的服务端身份令牌** 定义好唯一的`serverIdentity`字符串变量名以及具体数值内容,保证前后两端能够相互识别彼此合法性: ```properties nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=<your_custom_security_value> ``` 4. **精确映射各实体间关系** 对于每一个新建出来的普通成员来说,都应当明确指出其所归属的具体领域对象列表(比如某个微服务实例集合)。只有这样才可以实现精细化管理目标——让每个人只能看到自己应该知道的那一部分内容而已。 ```python # 示例代码片段展示如何动态加载外部属性源至springboot应用当中去 import org.springframework.boot.SpringApplication; import org.springframework.context.annotation.PropertySource; @PropertySource(value={"classpath:/custom-configs/${env}.properties"}, ignoreResourceNotFound=true) public class Application { public static void main(String[] args){ SpringApplication.run(Application.class, args); } } ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡布奇诺-海晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值