知识卡片

分层权限检查:从全局到局部逐层匹配

结构图卡

内容

权限的存储和检查往往按”作用范围从大到小”分层组织,检查时严格按这个 顺序从粗到细逐层查找,一旦在某一层找到明确的授权就停止,不会继续往 细粒度层级查。以MySQL为例,权限表分为全局层(作用于所有数据库)、 数据库层(作用于某个数据库的所有表)、表层(作用于某张表的所有列)、 列层(作用于单个字段)四个层级,检查一个操作是否被允许时,先看全局层 有没有授权,没有再往下看数据库层,依次类推,直到最细的列层——低层级 的表只能在高层级没有明确授权的范围内,进一步收窄或补充权限,不能绕过 高层级的限制凭空扩大权限。这套”先查粗粒度、找不到再查细粒度”的检查 顺序,本质上是把权限判断的默认路径设计成”先看大范围规则是否已经解决 问题,没解决才逐层深入查更具体的规则”,避免了每次访问都要遍历所有 细粒度权限记录带来的性能开销,也让大多数常见操作(如”这个用户能不能 访问这个数据库”)能在浅层级就得到答案。

结构图

flowchart TD
    A[用户发起操作请求] --> B{全局层是否已授权?}
    B -->|是| Z[允许执行]
    B -->|否/未涉及| C{数据库层是否已授权?}
    C -->|是| Z
    C -->|否/未涉及| D{表层是否已授权?}
    D -->|是| Z
    D -->|否/未涉及| E{列层是否已授权?}
    E -->|是| Z
    E -->|否| F[拒绝执行,返回错误]

参考来源

- 位置:《数据库原理(微课版)》第5章《数据库安全与保护》5.2.2节"权限 管理"(源文件:_epub-src/index_split_003.html) - 结论依据:原文明确"在MySQL权限表的结构中,user表在最顶层,是全局 级的;下面是db表——这两个表是数据库层级的;最后才是tables_priv表 和columns_priv表,它们分别是表级和列级的。低等级的表只能从高等级的 表得到必要的范围或权限。确认权限时,MySQL首先检查user表;如果指定 的权限没有在user表中被授权,则MySQL服务器检查db表……如果在该层级 没有找到指定的权限,则MySQL继续检查tables_priv表及columns_priv表", 因此可以推出从全局到局部逐层检查的机制。 - 原始内容:低等级的表只能从高等级的表得到必要的范围或权限。确认权限 时,MySQL首先检查user表;如果指定的权限没有在user表中被授权,则 MySQL服务器检查db表……如果在该层级没有找到指定的权限,则MySQL继续 检查tables_priv表及columns_priv表。