<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>平台简介 on Macula</title><link>https://macula.dev/docs/latest/00_introduce/</link><description>Recent content in 平台简介 on Macula</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://macula.dev/docs/latest/00_introduce/index.xml" rel="self" type="application/rss+xml"/><item><title>安全架构</title><link>https://macula.dev/docs/latest/00_introduce/%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://macula.dev/docs/latest/00_introduce/%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/</guid><description>&lt;h2 id="两层安全共同保护业务"&gt;两层安全共同保护业务&lt;/h2&gt;&#10;&lt;p&gt;Macula 将安全控制分为&lt;strong&gt;外层 Gateway&lt;/strong&gt;与&lt;strong&gt;内层 BFF / 微服务&lt;/strong&gt;。网关确认调用方身份并执行入口访问规则，微服务验证网关签发的 JWT，再按操作、方法和数据归属实施细粒度授权。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;层次&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;负责什么&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;典型能力&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IAM / System&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;登录与身份、角色、菜单、按钮及接口关联、应用凭据&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部 Token、权限规则与应用信息&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Gateway&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部认证、入口访问控制、内部 JWT 转换&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Token、AK/SK、API Key，URL 角色规则&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;BFF / Service&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;JWT 验签、业务方法和数据级控制&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SecurityUtils、@PreAuthorize、@PostAuthorize、@CheckOwner&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;前端菜单或按钮的可见性方便用户操作；真正的请求授权由网关和服务端共同完成。&lt;/p&gt;&#10;&lt;h2 id="安全原理图"&gt;安全原理图&lt;/h2&gt;&#10;&#10;&lt;figure class="security-architecture"&gt;&#10; &lt;div class="security-architecture-scroll" tabindex="0" role="region" aria-label="安全架构原理图，窄屏可横向滚动"&gt;&#10; &lt;svg id="macula-security-architecture" xmlns="http://www.w3.org/2000/svg" width="720" height="1380" viewBox="0 0 720 1380" role="img" aria-labelledby="security-title security-desc"&gt;&#10; &lt;title id="security-title"&gt;Macula 外层网关与内层微服务安全架构&lt;/title&gt;&#10; &lt;desc id="security-desc"&gt;客户端以 Token、AK/SK 或 API Key 进入网关。Token 经 IAM 认证与角色 URL 规则授权；AK/SK 经签名和应用 URL 范围检查；API Key 校验应用身份。网关生成内部 JWT，BFF 和业务服务使用网关 JWK 验签。认证上下文可由 SecurityUtils 读取。执行前进行 PreAuthorize 和 CheckOwner 入参资源校验，业务查询落实数据范围，返回后进行 PostAuthorize 或 CheckOwner 结果归属校验。&lt;/desc&gt;&#10; &lt;defs&gt;&#10; &lt;marker id="security-arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto"&gt;&lt;path d="M0 0 8 4 0 8Z" fill="#1672ce"/&gt;&lt;/marker&gt;&#10; &lt;style&gt;&#10; #macula-security-architecture { font-size: var(--macula-body-size, 15px); }&#10; #macula-security-architecture text { font-family: var(--macula-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif); fill: #172839; font-size: 1em; }&#10; #macula-security-architecture .heading { font-size: 1.2em; font-weight: 600; }&#10; #macula-security-architecture .strong { font-weight: 600; }&#10; #macula-security-architecture .muted { fill: #526579; }&#10; #macula-security-architecture .blue { fill: #145ca8; }&#10; #macula-security-architecture .mono { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: var(--macula-code-size, 14px); }&#10; @media (max-width: 767px) {&#10; #macula-security-architecture { font-size: var(--macula-body-size, 14px); }&#10; #macula-security-architecture .mono { font-size: var(--macula-code-size, 13px); }&#10; }&#10; #macula-security-architecture .box { fill: #fff; stroke: #b5c8db; stroke-width: 1.5; }&#10; #macula-security-architecture .line { fill: none; stroke: #1672ce; stroke-width: 2; marker-end: url(#security-arrow); }&#10; #macula-security-architecture .context { fill: none; stroke: #526579; stroke-width: 2; stroke-dasharray: 6 5; marker-end: url(#security-arrow); }&#10; &lt;/style&gt;&#10; &lt;/defs&gt;&#10; &lt;rect width="720" height="1380" rx="12" fill="#fff"/&gt;&#10; &lt;rect class="box" x="24" y="20" width="208" height="84" rx="8"/&gt;&#10; &lt;text x="128" y="54" text-anchor="middle" class="strong"&gt;浏览器 / OAuth2 调用方&lt;/text&gt;&#10; &lt;text x="128" y="83" text-anchor="middle" class="muted"&gt;Bearer Token&lt;/text&gt;&#10; &lt;rect class="box" x="256" y="20" width="208" height="84" rx="8"/&gt;&#10; &lt;text x="360" y="54" text-anchor="middle" class="strong"&gt;系统调用方&lt;/text&gt;&#10; &lt;text x="360" y="83" text-anchor="middle" class="muted"&gt;AK/SK · HMAC 签名&lt;/text&gt;&#10; &lt;rect class="box" x="488" y="20" width="208" height="84" rx="8"/&gt;&#10; &lt;text x="592" y="54" text-anchor="middle" class="strong"&gt;应用调用方&lt;/text&gt;&#10; &lt;text x="592" y="83" text-anchor="middle" class="muted"&gt;API Key&lt;/text&gt;&#10; &lt;path class="line" d="M128 104V122"/&gt;&lt;path class="line" d="M360 104V122"/&gt;&lt;path class="line" d="M592 104V122"/&gt;&#10; &lt;rect x="16" y="130" width="688" height="478" rx="12" fill="#f4f8fd" stroke="#b5c8db"/&gt;&#10; &lt;text x="36" y="164" class="heading"&gt;外层 · Gateway&lt;/text&gt;&#10; &lt;text x="36" y="190" class="muted"&gt;IAM 提供身份，System / Redis 提供权限与应用信息&lt;/text&gt;&#10; &lt;rect class="box" x="32" y="208" width="192" height="104" rx="8"/&gt;&#10; &lt;text x="128" y="239" text-anchor="middle" class="strong blue"&gt;Token 认证&lt;/text&gt;&#10; &lt;text x="128" y="270" text-anchor="middle"&gt;IAM introspection&lt;/text&gt;&#10; &lt;text x="128" y="297" text-anchor="middle" class="muted"&gt;读取用户 / 角色声明&lt;/text&gt;&#10; &lt;rect class="box" x="264" y="208" width="192" height="104" rx="8"/&gt;&#10; &lt;text x="360" y="239" text-anchor="middle" class="strong blue"&gt;AK/SK 认证&lt;/text&gt;&#10; &lt;text x="360" y="270" text-anchor="middle"&gt;HMAC 签名、Date&lt;/text&gt;&#10; &lt;text x="360" y="297" text-anchor="middle" class="muted"&gt;应用允许的 URL 范围&lt;/text&gt;&#10; &lt;rect class="box" x="496" y="208" width="192" height="104" rx="8"/&gt;&#10; &lt;text x="592" y="239" text-anchor="middle" class="strong blue"&gt;API Key 认证&lt;/text&gt;&#10; &lt;text x="592" y="270" text-anchor="middle"&gt;Bearer sk-...&lt;/text&gt;&#10; &lt;text x="592" y="297" text-anchor="middle" class="muted"&gt;校验 Redis 应用记录&lt;/text&gt;&#10; &lt;path class="line" d="M128 312V344"/&gt;&lt;path class="line" d="M360 312V344"/&gt;&lt;path class="line" d="M592 312V344"/&gt;&#10; &lt;rect class="box" x="32" y="352" width="192" height="80" rx="8"/&gt;&#10; &lt;text x="128" y="384" text-anchor="middle" class="strong"&gt;URL 角色授权&lt;/text&gt;&#10; &lt;text x="128" y="412" text-anchor="middle" class="muted"&gt;菜单 / 角色 / URL 规则&lt;/text&gt;&#10; &lt;rect class="box" x="264" y="352" width="424" height="80" rx="8"/&gt;&#10; &lt;text x="476" y="384" text-anchor="middle" class="strong"&gt;系统调用通道&lt;/text&gt;&#10; &lt;text x="476" y="412" text-anchor="middle" class="muted"&gt;保留应用身份，不自动赋予登录用户角色&lt;/text&gt;&#10; &lt;path class="line" d="M128 432V450H256V470"/&gt;&lt;path class="line" d="M476 432V450H464V470"/&gt;&#10; &lt;rect x="112" y="478" width="496" height="100" rx="8" fill="#e8f2fd" stroke="#1672ce" stroke-width="1.5"/&gt;&#10; &lt;text x="360" y="508" text-anchor="middle" class="strong blue"&gt;网关签发内部 JWT&lt;/text&gt;&#10; &lt;text x="360" y="538" text-anchor="middle" class="muted"&gt;身份、角色 / scope、租户：按认证方式提供&lt;/text&gt;&#10; &lt;text x="360" y="565" text-anchor="middle" class="mono"&gt;Authorization: Bearer &amp;lt;JWT&amp;gt;&lt;/text&gt;&#10; &lt;path class="line" d="M360 578V650"/&gt;&#10; &lt;text x="379" y="638" class="blue"&gt;网关 JWK 公钥验签&lt;/text&gt;&#10; &lt;rect x="16" y="660" width="688" height="666" rx="12" fill="#f6faf8" stroke="#b7cfc2"/&gt;&#10; &lt;text x="36" y="695" class="heading"&gt;内层 · BFF / 业务微服务&lt;/text&gt;&#10; &lt;rect class="box" x="112" y="716" width="496" height="96" rx="8"/&gt;&#10; &lt;text x="360" y="750" text-anchor="middle" class="strong"&gt;Security Starter 验证网关 JWT&lt;/text&gt;&#10; &lt;text x="360" y="783" text-anchor="middle" class="muted"&gt;建立 SecurityContext 认证上下文&lt;/text&gt;&#10; &lt;path class="line" d="M264 812V834H192V858"/&gt;&#10; &lt;path class="context" d="M464 812V834H536V858"/&gt;&#10; &lt;rect class="box" x="32" y="866" width="320" height="120" rx="8"/&gt;&#10; &lt;text x="192" y="898" text-anchor="middle" class="strong"&gt;执行前授权（按业务注解）&lt;/text&gt;&#10; &lt;text x="192" y="928" text-anchor="middle" class="mono"&gt;@PreAuthorize&lt;/text&gt;&#10; &lt;text x="192" y="957" text-anchor="middle" class="mono"&gt;@CheckOwner("#p0")&lt;/text&gt;&#10; &lt;text x="192" y="979" text-anchor="middle" class="muted"&gt;操作权限 / 资源 Passkey&lt;/text&gt;&#10; &lt;rect class="box" x="384" y="866" width="304" height="120" rx="8"/&gt;&#10; &lt;text x="536" y="898" text-anchor="middle" class="strong"&gt;SecurityUtils&lt;/text&gt;&#10; &lt;text x="536" y="930" text-anchor="middle"&gt;读取身份、角色、租户&lt;/text&gt;&#10; &lt;text x="536" y="961" text-anchor="middle" class="muted"&gt;辅助业务判断，读取不等于鉴权&lt;/text&gt;&#10; &lt;path class="line" d="M192 986V1008H264V1032"/&gt;&#10; &lt;path class="context" d="M536 986V1008H464V1032"/&gt;&#10; &lt;rect class="box" x="112" y="1040" width="496" height="90" rx="8"/&gt;&#10; &lt;text x="360" y="1074" text-anchor="middle" class="strong"&gt;执行业务方法&lt;/text&gt;&#10; &lt;text x="360" y="1107" text-anchor="middle" class="muted"&gt;查询 / 写操作落实数据范围与业务条件&lt;/text&gt;&#10; &lt;path class="line" d="M360 1130V1162"/&gt;&lt;text x="380" y="1153" class="muted"&gt;查询返回时&lt;/text&gt;&#10; &lt;rect class="box" x="80" y="1170" width="560" height="124" rx="8"/&gt;&#10; &lt;text x="360" y="1204" text-anchor="middle" class="strong"&gt;返回后校验 · 用于无副作用的查询&lt;/text&gt;&#10; &lt;text x="360" y="1237" text-anchor="middle" class="mono"&gt;@PostAuthorize&lt;/text&gt;&#10; &lt;text x="360" y="1268" text-anchor="middle" class="mono"&gt;@CheckOwner("returnObject.ownerUsername")&lt;/text&gt;&#10; &lt;text x="360" y="1358" text-anchor="middle" class="muted"&gt;外层与内层共同生效；列表范围与租户边界仍由业务落实&lt;/text&gt;&#10;&lt;/svg&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;figcaption&gt;网关处理入口认证与访问规则，微服务继续校验 JWT 和业务权限。窄屏可横向滚动，或&lt;a href="https://macula.dev/diagrams/security-architecture.svg"&gt;单独打开原理图&lt;/a&gt;查看。&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&#10;&lt;h2 id="原理图对应的关键配置"&gt;原理图对应的关键配置&lt;/h2&gt;&#10;&lt;p&gt;以下按图中的网关、内部 JWT 与微服务授权三个位置说明最小接入配置。环境变量由部署环境提供，完整参数分别见 &lt;a href="https://macula.dev/docs/latest/01_services/%E5%BE%AE%E6%9C%8D%E5%8A%A1/gateway/"&gt;Gateway&lt;/a&gt; 和 &lt;a href="https://macula.dev/docs/latest/01_services/%E6%A1%86%E6%9E%B6%E5%9F%BA%E7%A1%80/security/"&gt;Security&lt;/a&gt;。&lt;/p&gt;</description></item></channel></rss>