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
确认 resourceaction 是否匹配实际访问的命名空间/配置项。

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)划分命名空间与角色
- 生产最小权限,禁止滥用管理员
- 自动化账号使用专用角色与细粒度权限
- 定期审计用户-角色-权限绑定与无效账号