You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求教:如何在单个SQL表中实现安全组与用户表单权限?

表单权限控制的实用可扩展方案

针对你的需求,不建议用单表混存用户和角色权限——这种结构后期维护和扩展会非常头疼。推荐用用户-角色-权限的经典三范式结构,清晰又易扩展:

核心表结构

1. 基础信息表

  • Forms(表单表):存所有表单的基本信息
CREATE TABLE Forms (
    form_id INT PRIMARY KEY AUTO_INCREMENT,
    form_name VARCHAR(100) NOT NULL UNIQUE,
    description TEXT
);
  • Users(用户表):存用户账号信息
CREATE TABLE Users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    -- 其他字段:密码哈希、邮箱等
);
  • Roles(角色表):存安全角色,比如"管理员"、"普通员工"
CREATE TABLE Roles (
    role_id INT PRIMARY KEY AUTO_INCREMENT,
    role_name VARCHAR(50) NOT NULL UNIQUE,
    description TEXT
);

2. 关联表(处理多对多关系)

  • User_Roles(用户-角色关联):一个用户可以属于多个角色
CREATE TABLE User_Roles (
    user_id INT NOT NULL,
    role_id INT NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES Users(user_id),
    FOREIGN KEY (role_id) REFERENCES Roles(role_id)
);
  • Role_Form_Permissions(角色-表单权限):给角色分配表单的CRUD权限
CREATE TABLE Role_Form_Permissions (
    role_id INT NOT NULL,
    form_id INT NOT NULL,
    can_create BOOLEAN DEFAULT FALSE,
    can_read BOOLEAN DEFAULT FALSE,
    can_update BOOLEAN DEFAULT FALSE,
    can_delete BOOLEAN DEFAULT FALSE,
    PRIMARY KEY (role_id, form_id),
    FOREIGN KEY (role_id) REFERENCES Roles(role_id),
    FOREIGN KEY (form_id) REFERENCES Forms(form_id)
);
  • User_Form_Permissions(用户-表单权限):单独给用户分配权限(优先级高于角色权限,用于特殊场景)
CREATE TABLE User_Form_Permissions (
    user_id INT NOT NULL,
    form_id INT NOT NULL,
    can_create BOOLEAN DEFAULT FALSE,
    can_read BOOLEAN DEFAULT FALSE,
    can_update BOOLEAN DEFAULT FALSE,
    can_delete BOOLEAN DEFAULT FALSE,
    PRIMARY KEY (user_id, form_id),
    FOREIGN KEY (user_id) REFERENCES Users(user_id),
    FOREIGN KEY (form_id) REFERENCES Forms(form_id)
);

权限查询逻辑

判断某个用户对某表单的权限时,遵循以下顺序:

  1. 先查User_Form_Permissions,如果存在记录,直接用该记录的权限
  2. 如果没有用户单独权限,就查询该用户所属所有角色的Role_Form_Permissions,取权限的"或"结果(比如多个角色中只要有一个允许创建,就拥有创建权限)

关于你之前的单表方案

如果非要坚持单表,也可以加一个principal_type枚举字段(比如'USER'/'ROLE'),配合principal_id区分是用户还是角色ID,但这种方式有明显缺点:

  • 无法直接用外键约束,数据完整性难保证
  • 后期扩展其他权限主体(比如部门、岗位)时,要修改枚举值和查询逻辑
  • 权限查询SQL会变得复杂,需要多次判断类型

扩展性说明

这个结构很容易扩展:

  • 要加新权限(比如导出、打印),直接在权限关联表里加can_export、can_print字段
  • 要加权限有效期,在关联表里加valid_from、valid_to日期字段
  • 要加数据范围权限(比如只能查看自己创建的表单数据),可以在权限表中加data_scope字段(枚举值'ALL'/'OWN'/'DEPARTMENT'等)

内容的提问来源于stack exchange,提问作者Hepta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:13:21