本文介绍如何解决MSE Nacos实例登录失败问题。
问题现象
程序连接MSE Nacos时出现以下错误。
login failed.caused: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
问题原因
应用程序中配置了Nacos的
username和password,并同时开启了MSE Nacos的鉴权功能。由于MSE Nacos的鉴权功能使用的是阿里云RAM,不支持开源的默认鉴权插件,因此报错。关于阿里云RAM和MSE Nacos的鉴权功能的详细信息,请参见阿里云RAM和Nacos Client访问鉴权。
应用程序中配置了Nacos的
username和password,且未开启MSE Nacos的鉴权功能,但传入的username和password不正确,导致login failed。说明未开启MSE Nacos的鉴权功能时,您可以通过MSE的公网地址拼接URL的方式访问Nacos开源控制台,然后创建账号。但该方式会导致您的权限控制无法生效。例如,仅给予某个账号只读权限,但实际上并不会进行操作拦截。
解决方案
检查MSE Nacos实例是否已经打开鉴权功能。具体操作,请参见Nacos Client访问鉴权。
若未打开,可以通过Nacos 开源控制台创建对应的
username和password。若不希望使用
username和password或已打开鉴权功能,请参照下文移除username和password。
检查应用配置,是否有配置Nacos的
username和password。若存在,则需要移除相关信息。若直接使用
Nacos Client,请检查是否初始化Client时配置了以下信息。若存在,请移除该部分信息后重试。
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}"); properties.put(PropertyKeyConst.USERNAME, "${username}"); properties.put(PropertyKeyConst.PASSWORD, "${password}"); // 注册中心 NamingService namingService = NamingFactory.createNamingService(properties); // 配置中心 ConfigService configService = ConfigFactory.createConfigService(properties);若使用
Spring Cloud Alibaba,请检查应用配置是否完成了以下配置。若存在,请移除该部分信息后重试。
#通用设置 spring.cloud.nacos.username= spring.cloud.nacos.password= #注册中心 spring.cloud.nacos.discovery.username= spring.cloud.nacos.discovery.password= #配置中心 spring.cloud.nacos.config.username= spring.cloud.nacos.config.password=若使用
Dubbo, 请检查配置的注册中心URL上是否存在username或password参数。若存在,请移除该部分信息后重试。例如:
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?username=&password=若没有在应用配置中找到配置Nacos的
username和password,且使用的是Spring Cloud Alibaba,请在部署环境中检查启动参数以及环境变量是否包含相关信息。若存在,请移除这部分信息后重试。#启动参数 ps -ef | grep java | grep ${应用名} | grep -E 'username|password' #环境变量 env | grep -iE 'username|password'若以上方案均没有找到对应信息,且使用的是
Spring Cloud Alibaba,可在代码中全局检索username=和password=的关键字。若存在,请移除这部分信息后重试。说明Spring Cloud会读取环境变量、启动参数和依赖包中的配置文件,并按照一定的顺序尝试获取配置。若您的应用配置文件中不包含这些配置,但在其他文件有对应配置,也会导致其生效。
若以上方案均没有找到对应信息,且使用的是
Spring Cloud Alibaba,请排查应用所依赖的Nacos配置中是否包含对应信息。若存在,请移除这部分信息后重试。#Nacos配置中心中的配置文件名为: ${spring.application.name}.properties ${spring.application.name}.yaml ${spring.application.name}.yml