我们的产品建立在客户端-服务器架构上,服务器用 Java 实现(我们使用 POJO 和 Spring 框架)。我们在服务器上有两个 API 级别:
- 外部 API,它使用 REST Web 服务 - 对于外部客户端和与其他服务器的集成很有用。
- 内部 API ,它使用纯 Java 类 -对于内部的实际代码(业务逻辑多次调用 API 调用)以及与公司内部开发并作为我们产品的一部分部署的 plusins 集成很有用。外部 REST API 也使用内部 API。
我们在内部 API 中实现了权限检查(使用 Spring 安全性),因为我们希望在最低 API 级别控制访问。
但是问题来了:在 API 级别上定义了一些操作,这些操作被认为对当前登录的用户是禁止的,但应该由服务器本身顺利执行。例如,可以禁止用户删除某些实体,但服务器可能希望删除该实体,作为用户执行的某些其他操作的副作用,我们希望允许这样做。
那么,允许服务器执行实际登录用户可能禁止的操作(在某种超级用户模式下)的最佳方法是什么?
正如我所看到的,我们有几个选择,每个都有其优点和缺点:
- 在外部级别 API (REST) 中实施权限检查 - 不好,因为插件将绕过权限检查。
- 在请求被授予后关闭当前线程的权限检查 - 太危险了,我们可能允许太多应该被禁止的服务器操作。
- 明确要求内部 API 级别以特权模式执行操作(就像 java 安全框架中的 PrivilegedAction 一样) - 太冗长了。
由于上述方法都不是理想的,我想知道这个问题的最佳实践方法是什么?
谢谢。