Spring Cloud Alibaba系列(7)之:com.alibaba.nacos.api.exception.NacosException: user not found!
作者:mmseoamin日期:2024-02-03

传送门

Spring Cloud Alibaba系列之nacos:(1)安装

Spring Cloud Alibaba系列之nacos:(2)单机模式支持mysql

Spring Cloud Alibaba系列之nacos:(3)服务注册发现

Spring Cloud Alibaba系列之nacos:(4)配置管理

Spring Cloud Alibaba系列之(5):nacos源码本地环境搭建

问题重现

在前一节里面,通过最新的nacos版本2.2.3搭建了nacos集群。但是由于nacos自身的安全权限设计,在新版本中,不会默认开启控制台的权限认证

2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。

在用户开启鉴权后,控制台才需要进行登录访问。 同时针对不同的鉴权插件,提供新的接口方法,用于提示控制台是否开启登录页;同时在2.2.3版本后,Nacos可支持关闭开源控制台,并引导到用户自定义的Nacos控制台,详情可查看Nacos鉴权插件-服务端插件及控制台手册-关闭登录功能

所以如果按照文档中配置启用了鉴权,在客户端注册时,配置中需要nacos的账号/密码进行鉴权:

# nacos用户名
spring.cloud.nacos.username=nacos
# nacos密码
spring.cloud.nacos.password=nacos

否则在应用启动时,向nacos注册时就会报标题里面的错误:

com.alibaba.nacos.api.exception.NacosException: user not found!
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:306)
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doSubscribe(NamingGrpcClientProxy.java:255)
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.subscribe(NamingGrpcClientProxy.java:240)
	at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.subscribe(NamingClientProxyDelegate.java:160)
	at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:404)
	at com.alibaba.cloud.nacos.discovery.NacosWatch.start(NacosWatch.java:134)
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
	at org.springframework.context.support.DefaultLifecycleProcessor.access0(DefaultLifecycleProcessor.java:53)
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:895)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1247)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1236)
	at com.tw.tsm.auth.AuthApplication.main(AuthApplication.java:22)

 解决方法也就是在配置文件添加nacos的用户名/密码!

源码分析

从堆栈信息中,可以分析是注册时进行认证:检验用户/密码是否正确,所以可以在nacos-server端打个debug,可以发现是在,com.alibaba.nacos.core.auth.RemoteRequestAuthFilter#filter方法中:

Spring Cloud Alibaba系列(7)之:com.alibaba.nacos.api.exception.NacosException: user not found!,第1张

这个类是一个远程调用过滤器,所有的请求都会被拦截,然后里面会判断是否需要进行用户认证:如果发现nacos的认证开启了,就会往下走:

Spring Cloud Alibaba系列(7)之:com.alibaba.nacos.api.exception.NacosException: user not found!,第2张而这个配置恰恰是上面提到的

nacos.core.auth.enabled

 且看下官网对它的解释:

Spring Cloud Alibaba系列(7)之:com.alibaba.nacos.api.exception.NacosException: user not found!,第3张

继续跟进,会发现在原来是默认的鉴权插件中实现了真正的用户认证:

Spring Cloud Alibaba系列(7)之:com.alibaba.nacos.api.exception.NacosException: user not found!,第4张