数据权限
约 819 字大约 3 分钟
2025-03-03
系统通过 项目 → 区域 两级权限控制用户对资源的访问范围。
权限级别
| 级别 | 值 | 能做什么 |
|---|---|---|
管理 (AuthAdmin) | 1 | 所有操作 + 管理他人权限 |
读写 (AuthReadWrite) | 2 | 查看 + 控制设备、修改配置 |
只读 (AuthRead) | 3 | 仅查看,不能控制或修改 |
admin/owner 用户自动拥有所有权限,无需配置。
权限如何生效
权限按 项目 → 区域 逐级细化,项目权限是天花板,区域权限不会超过它。
区域权限匹配规则(按优先级):
- 精确匹配区域 ID — 优先级最高
- 路径前缀匹配 — 父区域权限自动继承给子区域
- 回退到项目级权限
示例:用户对项目 1 有只读权限,但区域路径 1/100/ 被单独授予了读写权限。此时操作区域 100 下的设备 → 读写权限生效。
各操作的权限要求
| 操作 | 要求权限 | 说明 |
|---|---|---|
| 属性控制、行为调用、发消息 | 读写 | 设备控制类操作 |
| 查看属性上报、行为结果 | 只读 | 设备数据查询 |
| 修改区域/项目信息 | 读写 | 管理类操作 |
| 删除区域 | 管理 | 高危操作需管理权限 |
设备分享
不在项目权限范围内的用户,可通过「设备分享」获得对特定设备的访问权限:
- 分享时可指定有效期和物模型级别的细粒度权限
- 分享权限为管理级别时等同完全控制
开发指南
在新接口中添加权限检查
设备操作类接口,调用 SchemaAccess:
import "gitee.com/unitedrhino/things/service/dmsvr/internal/logic"
// 写操作用 AuthReadWrite,读操作用 AuthRead
_, err := logic.SchemaAccess(l.ctx, l.svcCtx, def.AuthReadWrite, devices.Core{
ProductID: in.ProductID,
DeviceName: in.DeviceName,
}, nil)
if err != nil {
return nil, err
}区域管理类接口,先查区域信息再检查权限:
uc := ctxs.GetUserCtx(l.ctx)
if uc != nil && !uc.IsAdmin {
areaInfo, err := relationDB.NewAreaInfoRepo(l.ctx).FindOne(l.ctx, in.AreaID, nil)
if err != nil {
return nil, err
}
areaAuth := dataType.GetAreaAuthType(uc,
int64(areaInfo.ProjectID),
int64(areaInfo.AreaID),
string(areaInfo.AreaIDPath))
if areaAuth > def.AuthReadWrite { // 数值越大权限越低
return nil, errors.Permissions.AddMsg("区域权限不足")
}
}项目管理类接口,检查项目级权限:
uc := ctxs.GetUserCtxNoNil(l.ctx)
if !uc.IsAdmin && !uc.IsOwner {
projectRes := dataType.GetProjectResource(uc)
if projectRes == nil {
return nil, errors.Permissions.AddMsg("项目权限不足")
}
pi := projectRes.Projects[projectID]
if pi == nil || pi.AuthType > def.AuthReadWrite {
return nil, errors.Permissions.AddMsg("项目权限不足")
}
}关键代码文件
| 文件 | 说明 |
|---|---|
share/def/system.go | 权限级别常量定义 |
things/share/resource/project_provider.go | 项目资源数据结构与加载 |
things/share/dataType/helpers.go | 权限查询工具函数 |
things/service/dmsvr/internal/logic/auth.go | 设备操作权限检查入口 |
更新日志
2026/2/25 23:46
查看所有更新日志
74397-docs: 更新OTA升级文档添加OssCustomHost环境变量说明,更新数据权限和http协议接入文档于d4fa0-doc: 更换皮肤到最新版于
