2. 认证与授权基础:Authentication 与 Authorization 的区别、RBAC 模型、ABAC 模型简介

在构建 SSO 与令牌颁发系统之前,必须厘清两个最基础且最容易被混淆的概念:认证(Authentication)与授权(Authorization)。它们是安全架构的左右手,职责截然不同。本章将深入剖析二者的区别,并介绍两种主流的访问控制模型——RBAC 与 ABAC,为后续令牌设计与策略引擎打下理论基础。

2.1 认证 vs 授权:核心职责分离

认证回答的是“你是谁?”,授权回答的是“你能做什么?”。在架构层面,这两个过程必须严格分离,通常由不同的模块或服务处理。

维度 认证(Authentication) 授权(Authorization)
核心问题 你是谁? 你能做什么?
验证对象 身份凭证(密码、生物特征、令牌) 权限策略、角色、属性
典型机制 登录、MFA、OAuth2 授权码流程 ACL、RBAC、ABAC、策略引擎
失败结果 拒绝访问(401 Unauthorized) 禁止操作(403 Forbidden)
架构位置 网关、认证服务 资源服务、策略决策点(PDP)
令牌中的体现 sub、iss、exp、aud roles、permissions、scopes
架构避坑:很多系统将认证与授权逻辑混在同一个中间件中,导致权限变更需要重新登录。正确的做法是:认证产生身份令牌,授权基于令牌中的属性独立决策。SSO 只负责认证,授权由下游资源服务或独立的策略引擎完成。
认证与授权流程对比 用户 认证服务 (验证身份) 授权服务 (策略决策) 资源服务 (执行授权) 1. 提交凭证 2. 返回令牌 3. 请求资源 + 令牌 4. 鉴权请求 5. 允许/拒绝 6. 返回数据/错误 关键原则:认证只产生身份声明,授权基于声明做策略匹配,二者通过令牌中的 claims 解耦。

2.2 RBAC 模型:基于角色的访问控制

RBAC(Role-Based Access Control)是当前企业级应用中最广泛使用的授权模型。其核心思想是:权限不直接赋予用户,而是赋予角色,用户通过扮演角色获得权限。这种间接层极大地简化了权限管理。

2.2.1 RBAC 核心要素

  • 用户(User):系统使用者,唯一标识。
  • 角色(Role):权限的集合,代表一种职责或岗位,如“管理员”、“审计员”、“普通用户”。
  • 权限(Permission):对特定资源的操作许可,通常表示为 resource:action,如 document:read、order:delete。
  • 会话(Session):用户激活的角色集合,一个用户可以在一次会话中激活一个或多个角色。

2.2.2 RBAC 标准层级

层级 名称 核心特征 适用场景
RBAC₀ 核心 RBAC 用户-角色-权限 三元关系 小型系统、CMS
RBAC₁ 角色分层 角色继承(上级角色自动拥有下级权限) 企业组织架构
RBAC₂ 约束 RBAC 职责分离(SoD)、互斥角色、基数约束 金融、合规系统
RBAC₃ 统一 RBAC 角色分层 + 约束 大型企业、政府系统
架构实践:在 SSO 令牌中,通常不直接携带权限列表,而是携带角色列表。资源服务收到令牌后,根据角色在本地或策略引擎中解析出具体权限。这样做的好处是:权限变更无需重新颁发令牌,只需更新角色-权限映射。
RBAC 核心关系:用户 → 角色 → 权限 用户 Alice Bob Charlie 角色 管理员 编辑者 查看者 权限 document:create document:edit document:delete document:read 用户通过角色间接获得权限,角色是权限的容器,用户与角色是多对多关系。

2.3 ABAC 模型:基于属性的访问控制

ABAC(Attribute-Based Access Control)是一种更灵活、更细粒度的授权模型。它不再依赖固定的角色,而是根据主体(用户)、资源、环境的多维属性动态计算访问决策。ABAC 特别适合微服务、多云、IoT 等复杂场景。

2.3.1 ABAC 核心属性维度

  • 主体属性(Subject Attributes):用户 ID、部门、职级、安全等级、地理位置。
  • 资源属性(Resource Attributes):资源类型、所属项目、敏感度标签、创建者。
  • 环境属性(Environment Attributes):访问时间、IP 段、设备类型、网络环境。
  • 操作属性(Action Attributes):操作类型(读/写/删除)、批量操作标识。

2.3.2 ABAC 策略示例

// 策略:仅允许财务部门的员工在工作时间访问敏感财务报表
{
  "effect": "Allow",
  "condition": {
    "subject.department": "Finance",
    "resource.sensitivity": "High",
    "resource.type": "FinancialReport",
    "environment.time": {"between": ["09:00", "18:00"]},
    "environment.workday": true
  }
}

2.3.3 RBAC vs ABAC 对比

维度 RBAC ABAC
粒度 粗粒度(角色级) 细粒度(属性级)
灵活性 低,角色变更需管理员操作 高,策略可动态组合
管理复杂度 低,适合稳定组织架构 高,需要策略引擎与属性源
性能 高,缓存友好 中等,策略评估有计算开销
适用场景 企业后台、CMS、传统应用 微服务、数据湖、多云、合规审计
令牌内容 roles: ["admin", "editor"] attributes: {dept: "Finance", level: 5}
架构决策提示:不要盲目追求 ABAC。对于 80% 的企业应用,RBAC 已经足够。ABAC 的策略引擎(如 OPA、Casbin、AWS Cedar)会引入额外的延迟和运维成本。推荐采用混合模型:主体使用 RBAC 粗粒度控制,在关键资源上叠加 ABAC 细粒度约束。

2.4 本章小结

  • 认证与授权必须分离:认证产生身份令牌,授权基于令牌属性做决策,二者通过令牌中的 claims 解耦。
  • RBAC 是工业标准:通过角色间接管理权限,适合组织架构稳定的场景。支持角色分层与职责分离约束。
  • ABAC 提供极致灵活:基于主体、资源、环境的多维属性动态决策,适合复杂、多变的访问控制需求。
  • 令牌设计影响授权架构:令牌中携带 roles 还是 attributes,直接决定了资源服务的授权实现方式。