Bob Belderbos:基于 FastAPI 和 Azu... 笔记

Bob Belderbos:基于 FastAPI 和 Azure Entra ID 的数据库驱动型 RBAC

本项目实现了一个基于 FastAPI 的服务,利用 Azure Entra ID 进行身份验证,并采用细粒度的基于角色的访问控制(RBAC)。访问策略并非硬编码到各个路由中,而是存储在数据库表中。这使得管理员可以在不修改和重新部署应用程序代码的情况下更改用户权限。系统使用 Azure Entra ID 对用户进行身份验证,并从 JWT 声明中获取其角色。端点键与所需角色的映射存储在 EndpointPermission SQLModel 表中。授权逻辑的核心是一个 require 函数,该函数作为 FastAPI 依赖项使用。此函数从数据库中检索端点所需的角色,并检查已认证用户是否拥有其中任一角色。如果未拥有,则抛出 403 Forbidden 错误。端点键字符串是其在路由定义中唯一硬编码的字符串。关键的是,用于管理这些权限的端点本身也受相同的 RBAC 机制保护,确保只有管理员才能修改访问规则。防护措施防止管理员意外撤销自身对权限管理端点的访问权限,并确保角色分配永远不会为空。文章指出了两个常见的 Azure 配置问题:使用 v1 令牌而非 v2,导致令牌无效错误;以及嵌套组成员资格不会直接反映在用户角色分配中。该项目还提供了关于如何有效测试授权逻辑的指导。测试可以覆盖身份验证和会话依赖项,使用虚拟用户和内存 SQLite 数据库,从而在不依赖外部组件的情况下进行全面测试。通过将策略外部化为数据,该设计使授权具有动态性和可管理性,符合 12 要素应用原则。作者强调需区分代码逻辑与可变更的策略。