我开发了一个 Spring Boot 应用程序,其中有一组连接到公共服务层的控制器。我不介意使用任何协议(
REST,
GraphQL
、gRPC
等)来进行控制器和客户端之间的通信。以下是架构概述:
控制器与服务通信以检索数据。 根据用户的授权级别,我想在发送回之前修改响应数据。
例如:
如果用户是管理员,他们应该看到其他用户的所有字段,例如
username
和address
。
如果用户是普通用户,他们不应该看到像其他人的
username
和address
这样的敏感字段。
现在,我的挑战是:
我如何构建架构以便:
您是否会建议任何与 Spring Boot 配合良好的模式或实践? 示例:
考虑一个返回具有以下字段的 User 对象的服务方法:
public class User {
private String username;
private String address;
private String email;
private String phone;
// getters and setters
}
如果调用 API 的用户是管理员,他们应该收到完整的 User 对象:
{
"username": "morteza.j8",
"address": "Mashhad",
"email": "[email protected]",
"phone": "09123456789"
}
但是如果用户是普通用户,则响应应仅包含字段的子集:
{
"email": "[email protected]",
"phone": "09123456789"
}
如何跨多个控制器和服务以最有效且可维护的方式实现此字段过滤? 谢谢!
您希望根据访问该 URL 的用户的权限从同一 URL 获取不同的实体。这从根本上违背了 REST 哲学,即您的请求应该是无状态的。如果这样做,您将遇到缓存问题。由于 GET 请求是幂等的,它们几乎总是由中间件缓存,因此您会遇到这样的情况:用户在没有缓存的情况下检索数据可能会看到他们无权访问的信息。