Nacos 权限控制介绍及实战
方案背景
Nacos自开源依赖,权限控制一直需求比较强烈,这也反应了用户需求将Nacos部署到生产环境的需求。最新发布的Nacos 1.2.0版本已经支持了服务发现和配置管理的权限控制,保障用户安全上生产。本文主要介绍Nacos权限控制的设计方案和使用指南。
什么是权限控制?
在分布式服务调用时,需要对未知的或者不受信任的请求来源的请求进行识别和拒绝。权限控制一般分为两个阶段:身份识别(Authentication)和权限识别(Authorization)。身份认证主要确定访问者的身份,权限识别则判断这个访问者是否有对应资源的权限。
在Nacos的场景中,配置管理的权限控制指的是设置某个配置能否被某个用户读写,这个比较好理解,没有权限的用户旧无法读取或者写入对应的配置。服务发现的权限控制指的是用户是否有权限进行某个服务的注册或者订阅,这里需要注意的是服务发现的权限控制只能够控制用户是否可以从Nacos获取到服务的地址或者在Nacos上修改服务的地址。但是如果已经获取到了服务的地址,Nacos无法在服务真正调用时进行权限控制,这个时候的权限控制需要由服务框架来完成。

常见实现方式
认证(Authentication)
- 用户名+密码
- Cookie(只适用于浏览器)
- Session
- Token(JWT,Oauth,LDAP,SAML,OpenID)
- AK/SK
鉴权(Authorization)
- ACL: 规定资源可以被哪些主体进行哪些操作;
- DAC: 规定资源可以被哪些主体进行哪些操作 同时,主体可以将资源的权限,授予其他主体;
- MAC:a. 规定资源可以被哪些类别的主体进行哪些操作 b. 规定主体可以对哪些等级的资源进行哪些操作 当一个操作,同时满足a与b时,允许操作;
- RBAC: a. 规定角色可以对哪些资源进行哪些操作 b. 规定主体拥有哪些角色当一个操作,同时满足a与b时,允许操作;
- ABAC: 规定哪些属性的主体可以对哪些属性的资源在哪些属性的情况下进行哪些操作。
方案详情
Nacos的权限控制,目标是能够满足用户基本的鉴权需求,同时能够保持扩展性,可以支持去对接用户自带的用户管理系统或者鉴权系统,包括后面和K8S生态以及Service Mesh生态能够无缝的融合。基于这样的考虑,目前Nacos权限控制的设计是自带一个基本的实现,然后可以支持用户扩展。具体的设计如下。
模块设计
整体的模块设计是尽量将鉴权的逻辑抽象出来,不在服务发现模块或者配置管理模块添加相关的逻辑。通过配置文件可以选择当前使用的鉴权系统。Nacos自带的认证系统使用JWT Token,自带的鉴权系统使用的是RBAC。

认证算法
对于用户来说,不管是在控制台还是在客户端,都是上传用户名和密码来获取一个token,然后后续的每一次到Nacos的请求都会带上这个token来表明身份。这个token会有一个失效时间,对于控制台来说,只需要直接提示用户重新登录即可,对于客户端则需要有一个定期到Nacos刷新token的逻辑。

鉴权算法
Nacos自带的鉴权系统使用的是RBAC模型,可以在网上查询相关的资料。
数据模型
鉴权的数据模型也是基于标准的RBAC来设计的,分为用户、角色和权限三部分。用户就是由用户名和密码组成的用户信息,角色则是一个逻辑上的用户组,Nacos启动时会自带一个全局管理员的角色,只有这个全局管理员的角色可以进行添加用户、添加角色、添加授权等操作,保证安全性。而权限则是由资源+动作来组成。

接口设计
以下接口涉及到登录和鉴权的所有逻辑,这些接口除了登录接口,其他接口都只能由全局管理员来调用。
用户管理
- 创建用户:POST
/nacos/v1/auth/users?username=xx&password=yy
- 删除用户:DELETE /nacos/v1/auth/users?username=xx&password=yy
- 更新用户:PUT /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz
- 登录:POST
/nacos/v1/auth/users/login?username=xxx&password=yyy
角色管理
- 创建角色/绑定用户到角色:POST /nacos/v1/auth/roles?role=xx&username=yy
- 删除某个用户的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy
- 获取用户的所有角色:GET /nacos/v1/auth/roles?username=xxx
权限管理
- 给角色添加权限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
- 从角色删除权限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
- 获取某个角色的权限:GET /nacos/v1/auth/permissions?role=xxx
Nacos权限控制实战
安装Nacos 1.2.0
- 部署包准备。可以直接下载安装包:https://github.com/alibaba/nacos/releases/tag/1.2.0,也可以将Nacos master分支clone下来进行源码编译:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- 安装包解压,然后使用distribution/nacos-mysql.sql进行数据库初始化,主要是新增了users, roles, permissions三张表,standalone模式使用distribution/schema.sql进行初始化。
- Server端打开权限控制开关。修改con/application.properties内容:
nacos.core.auth.enabled=true
这个开关采用了热加载模式,无需重启Server即可生效。因此当权限控制功能使用有异常时,可以直接回滚到不鉴权的模式。
使用权限控制
1、使用管理员账号登录Nacos控制台(如果页面提示错误,可以情况浏览器缓存刷新页面):

可以看到,左侧边栏增加了一个父菜单和三个子菜单,分别用于权限控制里的用户创建、角色创建以及权限管 理。这个菜单栏只会在管理员登录的时候显示,也就意味着只有管理员才能进行权限的管理和分配。
2、管理用户。点击“用户列表”,进入用户管理页面,可以进行用户的创建、修改和删除:

3、管理角色。因为Nacos的自带的权限是基于角色来进行分配的,因此需要给创建好的用户绑定一些角色:

4、管理权限。角色创建好以后,就可以给这个角色赋予特定的权限了:

在“添加资源”对话框里,可以选择绑定的角色,命名空间资源以及对应的动作类型,例如在上图中,我们给角色role1绑定命名空间test的读写权限。然后又因为刚刚我们是将user1绑定到了role1上,那么user1这个用户就可以对test这个命名空间的资源进行读写操作了。
5、使用user1登录控制台。点击控制台右上角,退出admin账号,然后用刚才创建的user1进行登录:

如上图所示,首先是左侧的权限管理菜单消失了,因为当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担心,这个提示框意思是user1没有public命名空间的读权限,所以会弹出,但是不影响我们将命名空间切换到test:
如上图所示,我们可以看到test命名空间的配置数据了,下面我们再来介绍客户端的使用。
6、首先依赖最新的nacos 1.2.0客户端,然后在初始化时添加如下代码:
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "99a791cf-41c4-4535-9e93-b0141652bad0");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
// 配置用户名:
properties.put(PropertyKeyConst.USERNAME, "user1");
// 配置密码:
properties.put(PropertyKeyConst.PASSWORD, "pwd1");
ConfigService iconfig = NacosFactory.createConfigService(properties);
7、使用客户端进行正常的读写配置操作。
Nacos 权限控制介绍及实战的更多相关文章
- 自定义Spring Security权限控制管理(实战篇)
上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...
- asp.net core mvc权限控制:权限控制介绍
在进行业务软件开发的时候,都会涉及到权限控制的问题,asp.net core mvc提供了相关特性. 在具体介绍使用方法前,我们需要先了解几个概念: 1,claim:英文翻译过来是声明的意思,一个cl ...
- SpringSecurity 3.2入门(7)自定义权限控制介绍
总结Spring Security的使用方法有如下几种: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中. 二种是用户和权限用数据库存储,而资源(url)和权限的对应关系硬编 ...
- Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制
一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...
- ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...
- 基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制
字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见.可编辑性等处理.本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍. 在设计字段权限的时候,我们 ...
- Go语言实战 - revel框架教程之权限控制
一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...
- 权限控制框架Shiro简单介绍及配置实例
Shiro是什么 http://shiro.apache.org/ Apache Shiro是一个非常易用的Java安全框架,它能提供验证.授权.加密和Session控制.Shiro非常轻量级,而且A ...
- Spring cloud微服务安全实战-6-4权限控制改造
授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...
随机推荐
- 树莓派4B-SPI读写flash-FM25CL16B(同时支持FM25CL64等其它系列Flash)
1.树莓派SPI介绍 4B的引脚如下图所示: 其中Pin19.21.23是SPI0,接口定义如下所示: 时钟(SPI CLK, SCLK) 主机输出.从机输入(MOSI) 主机输入.从机输出(MISO ...
- Rsync+Sersync数据实时同步(双向)
Rsync+Sersync数据实时同步(双向) 服务介绍 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.se ...
- 前端集合传参,springmvc后端如何接收
废话不多说,上代码 后端接收对象: class ObjectA{ private String a; private String b; private List<ObjectB> lis ...
- MySQL 数据库恢复一张表中的数据
如果使用 mysqldump -uroot -p123 user > test.sql备份了user数据库中的所有数据,但是当前只想要恢复该数据库的某张表数据,该怎么处理呢? 已知恢复整个数据库 ...
- 令牌桶限流思路分享(PHP+Redis实现机制)
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- redis学习笔记(一)——windows下redis的安装与配置
前言 很久没有写东西了(.......我的水平就是记个笔记),北漂实习的我,每天晚上回来都不想动,但是做为社会主义接班人的我,还是要时刻给自己充充电,趁着年轻,趁着日渐脱发的脑袋还没有成为" ...
- 如何使用Jdk查看源码?
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 最近,有很多读者问我,有没有j ...
- Apache Superset 1.2.0教程 (二)——快速入门(可视化王者英雄数据)
上一篇我们已经成功的安装了superset,那么该如何可视化我们的数据呢?本文将可视化王者英雄的数据,快速的入门Superset. 一.连接数据源 首先确保mysql可以正常连接使用,并且准备好数据. ...
- python对象类型
一.内置对象 对象类型 分类 是否可变 例子 数字 数值 否 123,3.12 字符串 序列 否 'test',"test's" 列表 序列 是 [1,2,3,[1,2,'test ...
- 记录APP 启动ACTIVITITY
a.启动待测apkb.开启日志输出:adb logcat>D:/log.txt c.关闭日志输出:ctrl+cd.查看日志找寻: Displayed com.mm.android.hsy/.ui ...