主题
PERMISSIONS 权限表
权限表记录“谁可以对哪个资源执行哪些操作”,并可附加数据范围、资源创建者和文件类型等限制。它保存分配给用户或用户组的权限,不是用户最终有效权限的清单;实际访问还会结合用户组、上级资源授权及业务规则判断。
位置
- 模型路径:
/sysdata/data/tables/sec/PERMISSIONS.tbl - 物理表名:
SZSYS_5_PERMISSIONS
表结构
| 字段名 | 字段类型 | 含义与存储格式 |
|---|---|---|
| PERMISSION_ID | VARCHAR(64) | 权限记录的唯一 ID,主键。新增记录时使用新的唯一值 |
| OWNER_ID | VARCHAR(64) | 被授权的用户 ID 或用户组 ID,由 OWNER_TYPE 区分 |
| OWNER_TYPE | VARCHAR(1) | u:用户;g:用户组 |
| RES_PATH | VARCHAR(512) | 资源的完整权限路径或路径匹配规则,见资源与操作 |
| ALLOWS | VARCHAR(4096) | 允许的操作码,以英文分号 ; 分隔,例如 view-file;view-data |
| FORBIDS | VARCHAR(4096) | 禁止的操作码,以英文分号 ; 分隔,例如 dev-delete-file;dev-export-file |
| DATA_RANGE | VARCHAR(2048) | 数据范围的 JSON 对象文本;未设置表示本条记录不追加数据范围限制 |
| GRANTOR | VARCHAR(64) | 分配权限的用户 ID |
| GRANT_TIME | TIMESTAMP | 分配时间;模型默认值为当前时间 |
| OPTIONS | VARCHAR(1024) | 扩展选项的 JSON 对象文本;未设置表示不追加这些限制 |
数据库中的 ALLOWS、FORBIDS 是分号分隔的文本,不是 JSON 数组;DATA_RANGE、OPTIONS 则必须是合法 JSON,不含注释。
表索引与记录规则
模型仅声明 PERMISSION_ID 为主键,没有声明其他索引或组合唯一约束。同一用户或用户组可以对同一资源保存多条记录,例如分别为查看数据和导出数据指定不同的数据范围。
每条记录中的数据范围和扩展选项随该记录一起参与授权判断。不要将不同范围的操作随意合并为一条记录,否则会改变各项操作的限制。
资源与操作
RES_PATH 使用权限资源路径,不是浏览器 URL。例如:
| 写法 | 含义 |
|---|---|
/DEMO/ana/sales.rpt | DEMO 项目中的指定报表 |
/DEMO/ana | 指定目录,授权可由其下级资源继承 |
/sys/extensions | 系统扩展管理资源 |
/DEMO/ana/*.rpt | 该目录下的报表,* 不跨越 / |
/DEMO/ana/** | 该目录及任意层级的下级路径 |
路径还支持 ${...} 表达式,按当前用户求值后匹配资源。
ALLOWS、FORBIDS 填写操作码,而不是操作的显示名称。操作码按 - 分级,父操作包含其子操作,例如 dev-create 包含 dev-create-rpt 和 dev-create-dash。只需要部分能力时应填写具体操作,避免授予整个父级操作。
应从目标资源适用的权限操作目录中选择操作。应用可以自定义操作目录;业务自定义操作应使用该应用声明的操作码。
例如,为用户组 sales-readers 分配报表查看和数据查看权限时,可使用以下字段值。用户组 ID 和资源路径需替换为实际值,其余可选字段可不设置:
| 字段 | 示例值 |
|---|---|
| PERMISSION_ID | 为本条记录新生成的唯一 ID |
| OWNER_ID | sales-readers |
| OWNER_TYPE | g |
| RES_PATH | /DEMO/ana/sales.rpt |
| ALLOWS | view-file;view-data |
数据范围字段格式
DATA_RANGE 用于约束相关操作能够访问的数据,不会单独授予查看、查询或导出权限。范围按项目配置的数据范围维度生效;目标模型需要配置相应的维度关系。
直接指定条件
以下示例允许访问行政区划编码为 420100 的数据。dim 必须替换为项目数据范围维度对应的真实维表 ID,不能填写维表名称或字段名称。
json
{
"desc": "武汉市数据",
"items": [
{ "dim": "DIM_REGION_ID", "value": ["420100"] }
]
}| 属性 | 含义 |
|---|---|
desc | 可选的范围说明,用于展示,不参与过滤 |
items | 数据范围条件,支持下列三种结构 |
条件中的 dim | 数据范围维度对应的维表 ID |
条件中的 value | 维度取值列表、单个字符串,或以 = 开头的表达式。数值取值使用数组,例如 [420100] |
items 的三种结构:
- 单个条件:
{"dim":"DIM_REGION_ID","value":["420100"]}。 - 条件数组:
[{"dim":"DIM_REGION_ID","value":["420100"]},{"dim":"DIM_PRODUCT_ID","value":["A"]}],各条件同时满足(AND)。 - 条件组数组:
[[{"dim":"DIM_REGION_ID","value":["420100"]}],[{"dim":"DIM_REGION_ID","value":["420200"]}]],满足任一组即可(OR),每组内各条件同时满足。
不要写入空条件组。未设置 items 表示不追加范围限制,items: [] 则是无效配置,两者含义不同。当前权限读取使用 items,不读取 columns;不能通过在这里填写 columns 限制字段访问。
引用项目预设范围
json
{ "id": "sales-region" }id 对应资源所属项目设置中的预设数据范围 ID;固定值 default 表示项目默认数据范围。设置 id 后使用引用的范围,不再使用本条记录中直接填写的 items。预设不存在时,本条权限不生效;引用 default 而项目未设置默认范围时,表示不追加范围限制。
无效条件
缺少 dim、取值列表为空、items 结构无法识别或引用的预设不存在,会使本条权限不生效,可在“我的权限”中检查相应的未生效权限。
表达式返回 null 时保留操作授权,并生成取值为字符串 "null" 的范围条件;这不表示取消范围限制。应确保表达式能返回业务上有效的维度值。
扩展选项字段格式
OPTIONS 的属性均可选,不需要时可不设置整个字段。
| 属性 | 类型 | 效果 |
|---|---|---|
matchOwner | boolean | 为 true 时,仅匹配当前用户创建的资源文件,不匹配目录 |
alwaysShowFolder | boolean | 为 true 时,可在元数据资源列表中显示尚不存在的授权目录,供用户在其中创建内容;不会提前创建实际目录 |
fileTypes | string[] | 收窄“新建其他文件”(dev-create-file)允许的文件类型 |
仅允许操作自己创建的文件:
json
{ "matchOwner": true }为用户预留工作目录时可使用 alwaysShowFolder。它要求父目录已经存在,只补出下一层目录;适用于固定路径或表达式求值后的固定路径,不适用于含通配符的路径。matchOwner 为 true 时忽略此选项。
只允许新建 TXT、CSV 等其他文件:
json
{ "fileTypes": ["txt", "csv"] }类型写小写后缀,不带点号。未设置 fileTypes 或设置为 ["*"] 表示不追加类型限制;["*", "!csv"] 表示排除 CSV。不要只写排除项,也不要在同一列表中同时允许和排除同一类型。
报表、模型、目录等具有专用新建操作,应分别授予 dev-create-rpt、dev-create-tbl、dev-create-fold 等操作,不能用 fileTypes 代替。此属性也不用于限制删除类型或导出格式。
修改与验证
- 最终权限需要综合用户直接授权、用户组授权、上级资源授权和禁止项判断,不能仅凭某一行确认用户是否有权。不同数据范围的授权也可能合并,新增一条较窄范围的记录不一定能收窄已有权限。
- 修改前校验 JSON、操作码及其适用资源。不要依靠错误配置拒绝访问:当前读取过程可能忽略无法解析的 JSON,使对应限制没有生效。
- 建议通过权限管理界面修改。第三方工具直接改库不会自动触发权限缓存刷新;若直接修改,应在维护窗口重启各服务节点,并重新登录验证。
- 验证时同时检查允许访问和应被拒绝的场景;有数据范围时,还需核对实际返回的数据。
