跳到主要内容

认证、授权与信任边界

认证确认请求主体是谁,授权判断该主体能否对特定资源执行某个动作。网络位置、已登录状态和有效 JWT 都不能单独证明用户有权访问订单、租户或管理接口。

1. 先标出系统的信任边界

浏览器、移动端、外部 API、网关、内部服务、消息队列和数据库之间都存在边界。每跨过一层,都要明确凭据从哪里来、由谁验证、哪些 header 可以信任,以及身份如何传递。

“内网请求可信”会在 SSRF、错误安全组、被攻陷服务或开发端口暴露时失效。内部调用同样需要经过身份验证、授权和最小网络访问控制。

2. 身份验证建立 principal

用户可以通过密码加多因素、企业身份提供方或 passkey 登录;服务可以使用 mTLS、工作负载身份或签名 token。验证成功后得到稳定 principal,以及发行者、认证强度和会话信息。

用户名、tenant ID 等业务字段不能直接从未验证请求中采信。网关若把身份写入内部 header,应先删除外部同名 header,并保证下游只能通过受信网络或签名上下文接收。

3. 授权按主体、资源、动作和上下文判断

一次授权决策至少包含:

principal + action + resource + context → allow / deny

ROLE_USER 只能说明粗粒度身份,不能证明当前用户拥有 /orders/42。服务要读取资源所属租户、所有者和状态,再判断是否允许查看、退款或删除。

默认拒绝未知动作和资源。只有显式规则满足时放行,并避免在 Controller、Service 和 SQL 中出现互相矛盾的多套判断。

4. RBAC 与 ABAC 解决不同复杂度

RBAC 把权限分给角色,再把角色分给用户,适合职责稳定、权限集合有限的系统。角色持续组合成“华东区临时只读财务管理员”等名称时,模型会失控。

ABAC 根据主体、资源、动作和环境属性计算,例如租户一致、资源 owner 相同、金额低于审批阈值且设备可信。它表达能力更强,也更需要策略版本、测试、解释和属性来源治理。

实践中常用 RBAC 提供基础权限,再用资源所有权和上下文条件收紧。

5. 多租户边界落实到数据访问

每次查询都要从已认证上下文取得 tenant ID,并与资源过滤条件绑定。不能由前端传 tenant ID 后只检查 token 是否有效。

可在数据访问层、行级安全策略或独立数据库中加强隔离。缓存 key、消息 key、对象存储路径和搜索索引也要包含租户边界,避免主数据库正确而旁路泄漏。

管理员跨租户访问应使用单独高权限流程,记录原因和审计,不给普通会话长期全局权限。

6. 网关执行粗粒度,服务执行资源级规则

网关适合验证 token、检查 scope、阻止明显无权访问的 API,并建立可信身份上下文。领域服务掌握资源和业务状态,负责最终授权。

两层校验负责不同边界:入口减少攻击面,资源服务保护自身不变量。异步消费者和内部调用可能不经过外部网关,也需要等价身份和权限边界。

7. 权限变化需要可传播和可撤销

长期 token 中固化角色会让权限变更延迟到 token 过期。高风险操作可以使用短期 access token、实时策略查询或权限版本;禁用账号和紧急撤权要有明确时限。

中心策略服务故障时,普通只读与管理员写操作可以采用不同失败策略。缓存权限结果要绑定主体、资源、动作、策略版本和合理 TTL。

8. 授权决策需要审计证据

记录谁在何时以哪个会话对什么资源执行什么动作、策略版本和结果。拒绝日志要限制敏感信息与高频攻击造成的日志放大。

审计记录不能只依赖业务访问日志,也不能让普通业务管理员修改。高风险操作应关联工单、审批和前后状态摘要。

9. 常见问题

9.1 拥有管理员角色是否可以跳过资源检查

只有策略明确授予相应范围时才可以。管理员也可能只管理某个租户或区域,高权限入口应单独审计,并尽量使用临时授权。

9.2 服务间使用同一个共享 token 可以吗

共享 token 无法区分调用者、难以单独撤销,也扩大泄漏影响。应使用工作负载身份或每个服务独立凭据,并让目标服务按调用者和动作授权。

10. 面试题

10.1 为什么网关完成鉴权后仍可能发生水平越权

出现公司:滴滴

考察重点

  • 认证、粗粒度 scope 和资源级授权。
  • tenant、owner 和可信属性来源。
  • 网关、领域服务与异步入口的职责。

相关内容:第 1 节“先标出系统的信任边界”至第 8 节“授权决策需要审计证据”。

参考回答

网关验证 token 后只能确认主体身份和粗粒度 scope。用户访问 /orders/42 时,是否有权还取决于订单所属租户、owner、状态和具体动作,这些数据通常由订单服务掌握。如果服务只检查“已登录”,用户修改资源 ID 就可能读取他人订单。

网关应删除外部伪造的身份 header,写入受保护的 principal 和 tenant 上下文;领域服务用该身份结合资源属性做默认拒绝的授权,数据查询也绑定 tenant 条件。内部调用和消息消费者不能绕过同等规则,高风险决策记录策略版本、主体、资源和结果供审计。