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方法中:
这个类是一个远程调用过滤器,所有的请求都会被拦截,然后里面会判断是否需要进行用户认证:如果发现nacos的认证开启了,就会往下走:
而这个配置恰恰是上面提到的
nacos.core.auth.enabled
且看下官网对它的解释:
继续跟进,会发现在原来是默认的鉴权插件中实现了真正的用户认证: