nacos 返回 403 unknown user 太他么坑了 源码解析

大家好,我是烤鸭:

    nacos 真的是有点意思,有时候哪怕某个jar包版本冲突了都可能导致莫名其妙的错误,源码走一波吧。

当前版本

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.6.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR12</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         <version>2.2.1.RELEASE</version>
    </dependency>
</dependencies>

报错日志

com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Sat May 14 06:51:53 CST 2022</div><div>There was an unexpected error (type=Forbidden, status=403).</div><div>unknown user!</div></body></html>
	at com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig(ClientWorker.java:262)
	at com.alibaba.nacos.client.config.NacosConfigService.getConfigInner(NacosConfigService.java:143)
	at com.alibaba.nacos.client.config.NacosConfigService.getConfig(NacosConfigService.java:92)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData(NacosPropertySourceBuilder.java:85)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.build(NacosPropertySourceBuilder.java:74)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosPropertySource(NacosPropertySourceLocator.java:204)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosDataIfPresent(NacosPropertySourceLocator.java:191)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosConfiguration(NacosPropertySourceLocator.java:161)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadExtConfiguration(NacosPropertySourceLocator.java:129)
	at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:102)
	at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:52)
	at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:47)
	at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:101)
	at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:623)
	at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:367)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
	at com.xxx.xxx.task.XxxTaskApplication.main(XxxTaskApplication.java:11)

问题猜想

nacos-client 1.2.0 以下的官方bug

https://blog.csdn.net/qq_35337554/article/details/104914397

这种问题大概率是版本问题,springboot/cloud/alibaba-cloud 参考版本。
https://blog.csdn.net/qq_38637558/article/details/114448690

client版本和server版本也要对的上,要注意下,不能盲目升client的版本,client和server 参考版本。

https://www.jianshu.com/p/df88e1967036

看看源码

如果上面的博客都看过了,还没解决问题,可能跟我的问题相似。

我们看下报错地方的源码, 为什么会报错。

ClientWorker 中 getServerConfig方法的 agent.httpGet 返回 403

public String[] getServerConfig(String dataId, String group, String tenant, long readTimeout)
    throws NacosException {
    String[] ct = new String[2];
    if (StringUtils.isBlank(group)) {
        group = Constants.DEFAULT_GROUP;
    }

    HttpResult result = null;
    try {
        List<String> params = null;
        if (StringUtils.isBlank(tenant)) {
            params = new ArrayList<String>(Arrays.asList("dataId", dataId, "group", group));
        } else {
            params = new ArrayList<String>(Arrays.asList("dataId", dataId, "group", group, "tenant", tenant));
        }
        result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
    } catch (IOException e) {
        // 忽略无关代码
    }

    switch (result.code) {
         // 忽略无关代码
        case HttpURLConnection.HTTP_FORBIDDEN: {
            LOGGER.error("[{}] [sub-server-error] no right, dataId={}, group={}, tenant={}", agent.getName(), dataId,
                group, tenant);
            throw new NacosException(result.code, result.content);
        }
        default: {
            // 忽略无关代码
        }
    }
}

发现agent中的请求accessToken是null

在这里插入图片描述

accessToken 是项目启动后登录nacos返回的

这个就是 nacos-1.2.1 的源码,记住下面这个没有打印日志的异常。

SecurityProxy

public boolean login(List<String> servers) {

    try {
        if ((System.currentTimeMillis() - lastRefreshTime) < TimeUnit.SECONDS.toMillis(tokenTtl - tokenRefreshWindow)) {
            return true;
        }

        for (String server : servers) {
            if (login(server)) {
                lastRefreshTime = System.currentTimeMillis();
                return true;
            }
        }
    } catch (Throwable ignore) {
    }

    return false;
}

进 login 方法里看,我擦,报红了。

在这里插入图片描述

问题解决

Charsets 来自

import org.apache.commons.codec.Charsets;

pom

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.4</version>
</dependency>

问题找到了, 我们项目用的 commons-codec 版本是1.4 ,已经没有这个类了,降到 1.13 没问题了

总结

一个简单的问题搞这么复杂,翻了n多博客,都没找到原因。

编译没报错,启动时候报错日志也没有,到请求nacos的时候,变成403了,这尼玛怎么找。

阿里开源的果然很坑,不过 2.0 据说优化了很多内容,性能也有很大提升。

伟大的开源都少不了大家的踩坑和pr,希望国产开源也越来越好吧,而不是为了什么OKR。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
读取nacos unknown user 可能是因为在使用nacos时,用户认证失败或者用户不存在。nacos是一个开源的动态服务发现、配置和服务管理平台,可以帮助我们更方便地实现服务注册和发现、动态配置管理等功能。 当我们在使用nacos时,如果遇到 "unknown user" 的错误信息,说明用户认证出现了问题。首先,我们需要检查我们在nacos的配置中正确设置了用户名和密码,确保与nacos的用户信息一致。然后,我们可以尝试重新登录nacos操作界面,确保我们输入的用户名和密码是正确的。 如果上述步骤都没有解决问题,我们需要确认用户是否在nacos中正确注册。在nacos中,我们可以通过创建用户的方式来添加用户,并为其分配相应的角色权限。如果我们没有为该用户创建对应的角色或没有给予足够的权限,那么用户在访问nacos时就会出现 "unknown user" 的错误提示。 最后,我们还可以检查我们的网络连接是否正常,确保我们能够正常连接到nacos服务器。如果网络连接出现异常,也可能导致 "unknown user" 的错误。 总结来说,当我们在读取nacos时出现 "unknown user" 的错误信息时,我们需要检查以下几点:确认nacos的用户名和密码是否设置正确,重新登录nacos,确保输入正确;检查用户是否在nacos中正确注册并分配了相应的角色权限;检查网络连接是否正常。希望以上解答对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤鸭的世界我们不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值