9.6.2 用户、角色与权限模型
本节介绍 Nacos 权限体系中的用户、角色与权限模型设计,解释三者关系与授权流程,并给出可执行示例、排错与练习,帮助在多团队、多环境中实现精细化访问控制。Nacos 默认基于 RBAC(Role-Based Access Control)模型,用户通过角色获得权限,权限绑定到命名空间、配置与服务等资源对象。
原理草图(RBAC 与资源作用域)
用户(User)
用户是身份主体,可用于登录控制台、调用 OpenAPI。建议区分人类用户与服务账号(用于 CI/CD、脚本、集群同步)。
角色(Role)
角色是权限的集合,便于批量授权与管理。常见角色:管理员、运维、只读、应用专用角色。
权限(Permission)
权限定义“谁(用户)可以对什么(资源)做什么(操作)”。资源包含命名空间、配置(DataId/Group)、服务(Service/Cluster),操作包括读、写、删除、发布、查询等。
安装/启用鉴权(示例)#
需要先启用 Nacos 认证才能生效 RBAC。
1) 修改配置(单机示例)
文件路径:$NACOS_HOME/conf/application.properties
# 启用鉴权
nacos.core.auth.enabled=true
# 服务器身份密钥(建议生产自定义)
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security123
2) 重启 Nacos
cd $NACOS_HOME
sh bin/shutdown.sh
sh bin/startup.sh -m standalone
3) 登录控制台
默认地址:http://127.0.0.1:8848/nacos
默认账户:nacos / nacos(首次登录后立即修改)
关键命令与示例(用户/角色/权限)#
以下使用 OpenAPI 示例,需携带
accessToken。
1) 获取访问令牌#
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/users/login" \
-d "username=nacos&password=nacos"
预期输出(示例):
{"accessToken":"xxxxx","tokenTtl":18000,"globalAdmin":true}
2) 创建用户(服务账号)#
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/users" \
-d "username=ci-bot&password=StrongPass123"
预期输出:{"code":200,"message":"create user ok!"}
3) 创建角色并关联用户#
# 创建角色(如未存在)
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/roles" \
-d "role=dev-config-writer"
# 绑定用户到角色
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/roles/bind" \
-d "role=dev-config-writer&username=ci-bot"
4) 为角色授予权限#
以命名空间 dev、配置写权限为例
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/permissions" \
-d "role=dev-config-writer" \
-d "resource=namespaceId=dev;group=DEFAULT_GROUP;dataId=app.yaml" \
-d "action=WRITE"
5) 使用新账号发布配置(验证权限)#
# 先获取 token
TOKEN=$(curl -s -X POST "http://127.0.0.1:8848/nacos/v1/auth/users/login" \
-d "username=ci-bot&password=StrongPass123" | sed -n 's/.*"accessToken":"\([^"]*\)".*/\1/p')
# 发布配置(期望成功)
curl -s -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?accessToken=$TOKEN" \
-d "dataId=app.yaml" -d "group=DEFAULT_GROUP" -d "content=key: value" -d "tenant=dev"
数据库层面(高级查看/排错)#
Nacos 使用内置或外部 MySQL 存储用户、角色、权限。生产建议使用 MySQL。
查看用户/角色/权限(MySQL)
USE nacos_config;
-- 用户
SELECT username,enabled,create_time FROM users;
-- 角色
SELECT role,username FROM roles;
-- 权限
SELECT role,resource,action FROM permissions;
常见资源格式:namespaceId=dev;group=DEFAULT_GROUP;dataId=app.yaml
排错指南(常见问题)#
1) 登录成功但无权限
检查用户是否绑定角色、角色是否绑定权限:
curl -s "http://127.0.0.1:8848/nacos/v1/auth/roles?username=ci-bot"
curl -s "http://127.0.0.1:8848/nacos/v1/auth/permissions?role=dev-config-writer"
2) 操作返回 403
确认 resource 与 action 是否匹配实际访问的命名空间/配置项。
3) 启用鉴权后无法访问控制台
核对 application.properties 是否生效,查看日志:
tail -n 200 $NACOS_HOME/logs/nacos.log
确认出现 nacos.core.auth.enabled=true 生效提示。
练习#
1) 为 prod 命名空间创建只读角色 prod-reader,并绑定到用户 audit。
2) 让 ci-bot 只允许写 dev 命名空间下 app.yaml,禁止访问 prod。
3) 用 ci-bot 发布配置后,尝试读取 prod 命名空间配置,验证 403 拒绝。
实践建议
- 按环境(dev/test/prod)划分命名空间与角色
- 生产最小权限,禁止滥用管理员
- 自动化账号使用专用角色与细粒度权限
- 定期审计用户-角色-权限绑定与无效账号