nacos新版踩坑

背景
官方软件更新的背景

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

官方参考链接:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html

我的使用背景

之前用的旧版本nacos,许多服务的nacos client端都没有开启鉴权。但是为了保证运维开发人员不能随意改配置,管理页面上是有认证的。(nacos2.2.2版本前刚好都满足)

冲突

冲突1:nacos升级到2.2.2之后,如果没开启鉴权,管理页面没有登录功能了,访问进去可以直接修改配置。

冲突2:我们有很多服务,部分陈旧服务甚至没有源码,把鉴权加上不太可行。

冲突3:尝试用nginx代理访问nacos,在nginx上用auth_basic设置账号密码。发现即便是账号密码输入正确也不行,频繁报401的错。排查后发现,auth_basic和nacos都需要用Header中Authorization参数,发生了冲突。

解决方案

在nginx使用lua解析账号密码,使用cookie记录是否认证成功

步骤1:nginx中添加html登录页面login.html (输入账号密码,跳转的lua解析页面) --->

步骤2:lua解析页面,如果解析成功账号密码,就写一个cookie,并跳转到nacos页面 -->

步骤3:nacos页面判断是否有cookie,如果有cookie就访问nacos页面,如果没有对应的cookie就跳转到登录页面

nginx配置参考

复制代码
events {
    worker_connections  1024;
}

http {
    server {
        listen 80;

        # 登录页面
        location = /login.html {
            default_type text/html;
            content_by_lua_block {
                ngx.say([[
                <!DOCTYPE html>
                <html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <meta name="viewport" content="width=device-width, initial-scale=1.0">
                    <title>Nacos Login</title>
                </head>
                <body>
                    <h2>Nacos Login</h2>
                    <form method="post" action="/login">
                        <label for="username">Username:</label>
                        <input type="text" id="username" name="username" required><br><br>
                        <label for="password">Password:</label>
                        <input type="password" id="password" name="password" required><br><br>
                        <input type="submit" value="Login">
                    </form>
                </body>
                </html>
                ]])
            }
        }

        # 处理登录请求
        location = /login {
            content_by_lua_block {
                ngx.req.read_body()
                local args = ngx.req.get_post_args()

                local username = args.username
                local password = args.password

                -- 设定你的用户名和密码
                local valid_username = "sit"
                local valid_password = "sit"

                if username == valid_username and password == valid_password then
                    ngx.header["Set-Cookie"] = "auth=1; Path=/; HttpOnly"
                    ngx.redirect("/nacos")
                else
                    ngx.say("Wrong user or password!  Click the browser's 'Back' button to log in again")
                    ngx.exit(ngx.HTTP_UNAUTHORIZED)
                end
            }
        }

        # nacos路径
        location /nacos/ {
            # 如果认证不通过,就跳转到认证页面
            if ($cookie_auth != "1") {
                return 302 /login.html;
            }

            # 如果认证通过,代理请求到后端nacos服务器
            proxy_pass http://10.1.0.5:8848/nacos/;
        }
    }
}
相关推荐
凤凰院凶涛QAQ1 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案2 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
爱网络爱Linux2 小时前
Linux proc 目录安全加固
linux·运维·rhce·rhca·红帽认证·proc 目录安全加固
猿与禅2 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp2 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4772 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
持力行3 小时前
D-BUS会话总线
运维·网络
kdxiaojie3 小时前
Linux 驱动研究 —— I2C (5)
linux·运维·笔记·学习
程序员天天困3 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
独自归家的兔3 小时前
2026年7月2日 Docker 容器化部署 PaddleOCR-VL 实战(OpenAI 协议兼容 HTTP 调用)
运维·docker·容器