mengstack-website/guide/rbac.md
MengStack Dev fca3326e34 docs: 官网文档全面更新 — M2-M8 指南 + API 参考 + v0.2.0 更新日志
- 更新 changelog.md: v0.2.0 记录 M2-M8 全部完成,路线图更新
- 新增 5 篇指南: RBAC、组织管理、审计日志、通知模块、质量横切
- 新增 5 篇 API 文档: RBAC(11)、Org(5)、Audit(1)、Settings(7)、Notification(7)
- 更新 api/overview.md: 完整 37 端点列表
- 更新 config.ts: 侧边栏分组 + 11 页 SEO 元数据
2026-10-03 01:55:55 +08:00

102 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: RBAC 权限模型 | 角色权限管理与中间件鉴权 - MengStack官方文档
---
# RBAC 权限模型
MengStack 内置基于角色的访问控制(RBAC)模块,支持多租户隔离下的权限管理。
## 数据模型
RBAC 由 4 张核心表组成:
| 表 | 说明 | 关键字段 |
|------|------|----------|
| `permissions` | 权限定义 | code(唯一码)、name、module |
| `roles` | 角色定义 | tenant_id、name、is_system |
| `role_permissions` | 角色-权限关联(多对多) | role_id、permission_id |
| `user_roles` | 用户-角色关联 | user_id、tenant_id、role_id |
```
Permission ←→ Role ←→ User
(M:N) (M:N)
```
## 权限码规范
权限码采用 `模块:资源:动作` 三段式命名:
```
auth:user:read # 查看用户
auth:user:write # 编辑用户
rbac:role:manage # 管理角色
org:tenant:manage # 管理租户
notification:send # 发送通知
```
## 种子数据
框架启动时自动创建预置角色和权限:
| 角色 | 说明 | 权限范围 |
|------|------|----------|
| `admin` | 管理员(系统角色,不可删除) | 全部权限 |
| `editor` | 编辑者 | 内容读写 + 通知 |
| `viewer` | 查看者 | 只读权限 |
## 使用方式
### 1. 给用户分配角色
```bash
curl -X POST http://localhost:2222/api/v1/rbac/users/1/roles \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>" \
-H "Content-Type: application/json" \
-d '{"role_id": 1}'
```
### 2. 为角色设置权限
```bash
curl -X PUT http://localhost:2222/api/v1/rbac/roles/1/permissions \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>" \
-H "Content-Type: application/json" \
-d '{"permission_ids": [1, 2, 3]}'
```
### 3. 在路由中使用权限中间件
```go
// 在 routes.go 中
rbac.GET("/users", h.ListUsers, permMW.Require("auth:user:read"))
rbac.POST("/users", h.CreateUser, permMW.Require("auth:user:write"))
```
`permMW.Require()` 会从 JWT 中提取用户 ID 和租户 ID,查询该用户在此租户下的所有角色权限并集,判断是否包含所需权限码。
## 多租户隔离
- 角色按 `tenant_id` 隔离,不同租户的角色互不影响
- 用户角色关联也按 `tenant_id` 隔离,同一用户在不同租户可拥有不同角色
- 权限定义是全局共享的(不区分租户)
## API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/rbac/permissions` | 列出权限(可按 module 筛选) |
| POST | `/api/v1/rbac/roles` | 创建角色 |
| GET | `/api/v1/rbac/roles` | 列出角色 |
| GET | `/api/v1/rbac/roles/:id` | 获取角色详情 |
| PUT | `/api/v1/rbac/roles/:id` | 更新角色 |
| DELETE | `/api/v1/rbac/roles/:id` | 删除角色 |
| PUT | `/api/v1/rbac/roles/:id/permissions` | 设置角色权限 |
| GET | `/api/v1/rbac/roles/:id/permissions` | 获取角色权限 |
| POST | `/api/v1/rbac/users/:userId/roles` | 分配角色给用户 |
| DELETE | `/api/v1/rbac/users/:userId/roles/:roleId` | 移除用户角色 |
| GET | `/api/v1/rbac/users/:userId/roles` | 获取用户角色 |
详细接口参数见 [RBAC API 参考](/api/rbac)。