我正在使用 Spring Boot 开发一个 web API,但对于在哪里处理安全问题感到困惑。 Martin Fowler 在《企业应用程序架构模式》中建议
“表示逻辑纯粹通过服务层与域交互,服务层充当应用程序的 API。除了提供清晰的 API 之外,服务层也是放置事务控制和安全等内容的好地方。 ”
我完全同意服务层应该是事务控制的地方,但我经常使用并看到安全方面,例如在表示层(控制器)中管理的基于角色的访问控制。这让我有两种想法。
我认为控制表示层(或根据 Andrey 的说法是 API 层)的安全性实际上可以通过尽早处理检查来减少远程调用的开销,但在复杂的系统中,像我这样经验不足的程序员很难避免重复安全逻辑分散在不同的模板中。
从企业软件架构(需要考虑领域复杂性)和横切关注点的角度来看,REST架构中应该如何处理安全到:
出于说明目的,我当前的实现是在 Spring Boot 中进行的,但我正在寻找与框架无关的设计模式建议。
Martin 撰写这本书时,REST(表述性状态传输)和 SPA(单页应用程序)还不是很流行。我认为他正在研究服务器端渲染架构,例如 JSP/JSF,其中发送完全生成的视图,而不是其状态。在这种架构中,控制器确实是表示层的一部分,因为它们负责显示数据和处理用户界面事件。因此,将安全功能放在服务层中更符合逻辑。然而,在 REST 架构中,控制器在形成用户界面方面的作用已显着下降。表示层几乎完全转移到客户端浏览器,控制器只负责处理 HTTP 请求。在 REST 架构中,控制器不再是表示层的一部分,它们创建了一个新层 - API,安全功能和谐地融入其中。