微服务架构中的安全边界:网关鉴权 vs 子系统本地鉴权
在学习微服务架构(如 RuoYi-Cloud)时,很多开发者会产生一个经典疑问: "既然我已经有了一个统一的 Gateway 网关来做全局鉴权了,为什么像监控中心(Monitor)这样的子系统,还要自己引入 Spring Security 再做一层本地鉴权?这不是重复造轮子吗?"
这个疑问背后,隐藏着微服务架构设计中的两个核心考量:"路由边界" 与 "零信任纵深防御"。
一、 为什么不全靠网关?(监控中心的特殊性)
首先,我们必须明确微服务组件的物理部署与路由关系。
1. 业务服务的标准流转
对于普通的业务微服务(如 ruoyi-system):
-
流量路径:前端 -> Gateway (8080端口) -> 业务微服务 (9201端口)。
-
鉴权逻辑 :网关负责校验 Token 的合法性,校验通过后,将 UserID 等信息塞入 Header,转发给下游服务。下游服务完全信任网关透传过来的请求。
2. 监控中心的"法外之地"
监控中心(ruoyi-visual-monitor)是一个特殊的纯运维级系统。
-
流量路径 :为了防止网关宕机导致监控系统也无法访问,监控中心通常不会挂在网关后面 。运维人员会直接通过
http://服务器IP:9100访问监控中心。 -
致命缺陷:既然它绕过了网关,网关上的全局 Token 校验对它就形同虚设。如果它自己不加锁,任何知道 IP 和端口的人都能直接访问并控制你的所有服务器。
结论一:因为不在网关的保护伞下,所以必须自备门禁。
二、 认证机制的天然差异:Token vs Session
即使你强行把监控中心挂在网关后面,也会遇到第二个问题:认证协议不匹配。
1. 网关的无状态 API 鉴权 (Token)
-
网关是为前后端分离的无状态 API 设计的。
-
它的介质是 JWT Token,逻辑通常是开发者自己手写的(比如解析 Header 里的
Authorization字段)。
2. 监控中心的有状态 Web 鉴权 (Session)
-
监控中心(底层是 Spring Boot Admin)是一个传统的、自带 HTML 页面的 Web 应用。
-
它的受众是需要在浏览器里输入账号密码,然后保持长期登录状态的管理员。
-
这种场景下,基于 Cookie 和 Session 的传统表单登录才是最合适的。而这正是 Spring Security 最擅长的老本行。
结论二:业务 API 用 Token(网关手写),传统 Web 控制台用 Session(引入 Security),各司其职。
三、 高级架构理念:零信任与纵深防御 (Zero Trust)
在企业级安全架构中,有一个重要原则:"永远不要相信任何网络请求,即使它是从内网发出来的。"
假设我们完全依赖网关的保护,这就相当于把所有的宝都压在了"小区大门保安"身上:
-
如果黑客利用了网关的某个 0day 漏洞绕过了大门。
-
如果黑客直接潜入了内网,绕开网关,直接对 9100 端口发起请求。
如果监控中心(它有权限下载内存快照、甚至关停服务)处于"裸奔"状态,整个系统瞬间沦陷。
纵深防御策略(Defense in Depth):
-
Gateway 网关:小区大门保安,负责过滤 99% 的外部非法流量。
-
Spring Security (监控中心):自家入户门的指纹锁,负责守护最核心的运维资产。
总结
在微服务架构中,"统一网关鉴权" 和 "子系统引入 Security" 并不冲突,而是互补的。
下次如果有人问你这个问题,你可以这样回答:
"网关鉴权是针对无状态业务 API 的第一道防线;而监控中心作为绕过网关直连的运维控制台,且属于传统的有状态 Web 应用,必须引入 Spring Security 来实现基于表单的本地 Session 鉴权,这既是协议适配的需要,也是微服务纵深防御安全理念的体现。"