Nacos权限模块整合方案

Nacos是阿里巴巴开源的,用于服务发现和配置管理的中间件。配置中心已经使用Apollo,所以我们只需要使用服务发现能力即可。

问题

学习研究Nacos过程中,发现如下几点:

  1. Nacos的支持插件机制,包括权限模块
  2. Nacos管理后台,支持使用LDAP的方式对接已有权限系统
  3. Spring-cloud-nacos客户端需要配置用户名和密码,才能正常注册

第2点是为了用户方便使用公司内部账号访问Nacos。但这结合第3点使用就出现了冲突。假设一个部门多个人同时进行开发,这样某个人的用户名和密码就会暴露给了其他开发人员。

1
2
3
spring.cloud.nacos.discovery.namespace=provider
spring.cloud.nacos.discovery.username=test
spring.cloud.nacos.discovery.password=123456

Nacos本地身份验证和Ldap身份验证的区别

翻了一下源码,这两个方式,主要区别在于,ldap方式会先用Nacos本地身份验证,如果验证失败,才会使用ldap方式验证。

manager类涉及到身份认证,区别在上述已经说明。authPluginService涉及权限验证,两种方式代码完全是一样的,不存在差别。
鉴权模块类图

而且spring-cloud-nacos客户端,和管理后台用户登录,权限验证的代码完全一样。

解决方案,方案1

采用对称加密算法,对用户密码进行加密,这样就能避免把自己密码暴露给其他开发人员。

1
2
3
spring.cloud.nacos.discovery.namespace=provider
spring.cloud.nacos.discovery.username=test
spring.cloud.nacos.discovery.password=d0QfGkGaOUaerAgpeB73FfOeb14xknY0lQvoDR3YjcU=

这就需要修改Nacos部分源码,在进行服务端验证权限之前进行拦截,对加密的密码进行解密。

客户端 -》将加密的密码解密 -》服务端验证
身份验证流程

验证了一个想法,方案2

Nacos 服务端开启了ldap登录,用户登录成功后,就会在Nacos本地存储用户名和一个默认密码。用户名以”LDAP_”作为前缀。
自动创建的LDAP用户
管理员在后台可以修改用户密码
自动创建的LDAP用户

之后客户端使用Nacos本地保存的“LDAP_”前缀的用户名和密码,就可以正常注册服务了。

1
2
3
spring.cloud.nacos.discovery.namespace=provider
spring.cloud.nacos.discovery.username=LDAP_test
spring.cloud.nacos.discovery.password=123456

总结
1.所以一开始提出的问题,Nacos本身是有解决的。