Nacos自开源依赖,权限控制一直需求比较强烈,这也反应了用户需求将Nacos部署到生产环境的需求。最新发布的Nacos 1.2.0版本已经支持了服务发现和配置管理的权限控制,保障用户安全上生产。本文主要介绍Nacos权限控制的设计方案和使用指南。java
在分布式服务调用时,须要对未知的或者不受信任的请求来源的请求进行识别和拒绝。权限控制通常分为两个阶段:身份识别(Authentication)和权限识别(Authorization)。身份认证主要肯定访问者的身份,权限识别则判断这个访问者是否有对应资源的权限。mysql
在Nacos的场景中,配置管理的权限控制指的是设置某个配置可否被某个用户读写,这个比较好理解,没有权限的用户旧没法读取或者写入对应的配置。服务发现的权限控制指的是用户是否有权限进行某个服务的注册或者订阅,这里须要注意的是服务发现的权限控制只可以控制用户是否能够从Nacos获取到服务的地址或者在Nacos上修改服务的地址。可是若是已经获取到了服务的地址,Nacos没法在服务真正调用时进行权限控制,这个时候的权限控制须要由服务框架来完成。git
Nacos的权限控制,目标是可以知足用户基本的鉴权需求,同时可以保持扩展性,能够支持去对接用户自带的用户管理系统或者鉴权系统,包括后面和K8S生态以及Service Mesh生态可以无缝的融合。基于这样的考虑,目前Nacos权限控制的设计是自带一个基本的实现,而后能够支持用户扩展。具体的设计以下。github
总体的模块设计是尽可能将鉴权的逻辑抽象出来,不在服务发现模块或者配置管理模块添加相关的逻辑。经过配置文件能够选择当前使用的鉴权系统。Nacos自带的认证系统使用JWT Token,自带的鉴权系统使用的是RBAC。算法
对于用户来讲,不论是在控制台仍是在客户端,都是上传用户名和密码来获取一个token,而后后续的每一次到Nacos的请求都会带上这个token来代表身份。这个token会有一个失效时间,对于控制台来讲,只须要直接提示用户从新登陆便可,对于客户端则须要有一个按期到Nacos刷新token的逻辑。sql
Nacos自带的鉴权系统使用的是RBAC模型,能够在网上查询相关的资料。数据库
鉴权的数据模型也是基于标准的RBAC来设计的,分为用户、角色和权限三部分。用户就是由用户名和密码组成的用户信息,角色则是一个逻辑上的用户组,Nacos启动时会自带一个全局管理员的角色,只有这个全局管理员的角色能够进行添加用户、添加角色、添加受权等操做,保证安全性。而权限则是由资源+动做来组成。json
如下接口涉及到登陆和鉴权的全部逻辑,这些接口除了登陆接口,其余接口都只能由全局管理员来调用。浏览器
/nacos/v1/auth/users?username=xx&password=yy缓存
/nacos/v1/auth/users/login?username=xxx&password=yyy
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
nacos.core.auth.enabled=true
这个开关采用了热加载模式,无需重启Server便可生效。所以当权限控制功能使用有异常时,能够直接回滚到不鉴权的模式。
一、使用管理员帐号登陆Nacos控制台(若是页面提示错误,能够状况浏览器缓存刷新页面):
能够看到,左侧边栏增长了一个父菜单和三个子菜单,分别用于权限控制里的用户建立、角色建立以及权限管 理。这个菜单栏只会在管理员登陆的时候显示,也就意味着只有管理员才能进行权限的管理和分配。
二、管理用户。点击“用户列表”,进入用户管理页面,能够进行用户的建立、修改和删除:
三、管理角色。由于Nacos的自带的权限是基于角色来进行分配的,所以须要给建立好的用户绑定一些角色:
四、管理权限。角色建立好之后,就能够给这个角色赋予特定的权限了:
在“添加资源”对话框里,能够选择绑定的角色,命名空间资源以及对应的动做类型,例如在上图中,咱们给角色role1绑定命名空间test的读写权限。而后又由于刚刚咱们是将user1绑定到了role1上,那么user1这个用户就能够对test这个命名空间的资源进行读写操做了。
五、使用user1登陆控制台。点击控制台右上角,退出admin帐号,而后用刚才建立的user1进行登陆:
如上图所示,首先是左侧的权限管理菜单消失了,由于当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担忧,这个提示框意思是user1没有public命名空间的读权限,因此会弹出,可是不影响咱们将命名空间切换到test:
如上图所示,咱们能够看到test命名空间的配置数据了,下面咱们再来介绍客户端的使用。
六、首先依赖最新的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);
七、使用客户端进行正常的读写配置操做。