【发布时间】:2021-11-08 19:05:05
【问题描述】:
假设我有一个 SpringBoot 应用程序,具有以下要求。
- 它有一个
User类(实体) - 每个用户有零个或多个
Workspaces(一对多实体关系) - 每个
Workspace有零个或多个WorkItems(一对多实体关系)
有一个 CRUD REST API 控制器来管理所有实体,即我们有
-
UserController->User实体的 CRUD 操作 -
WorkspaceController->Workspace实体的 CRUD 操作 -
WorkItemContoller->WorkItem实体的 CRUD 操作
现在有一些要求......
-
User只能创建/编辑/删除他自己的Workspace实体 -
User只能在他自己的Workspaces中创建/编辑/删除WorkItem实体
此外,假设User 实体与SpringSecurity 集成,并且我们知道控制器和服务中的当前用户。
那么问题是……
实现用户权限检查的最优雅/干净/可维护的方式是什么?我们如何编写代码,在Service 类中将检查用户是否有权对给定资源执行操作。
我现在这样做的方式是有一个像这样的类,它检查每个Service调用中的权限。
class PermissionManager {
void checkUserAllowedToUseWorkspace(User u, Workspace w);
void checkUserAlloweToUseWorkitem(User u, WorkItem)
}
如您所见...随着作用域资源数量的增长...此类将变得超级臃肿且难以维护。
是否有人知道以干净和可维护的方式执行此范围资源访问的更好方法?
【问题讨论】:
-
假设 JPA 和 Hibernate,使用 hibernate 过滤器来限制基于用户本身的查询结果。您可以使用 AOP 启用过滤器以应用自动过滤。然后用户只能看到(因此可以修改)自己的数据。
-
嗨,@M.Deinum。听起来像是一种很酷的方法来限制基于关联用户实体的存储库输出。你能不能把一篇文章的链接发给我,这篇文章用一个代码示例来说明如何做到这一点?
-
callistaenterprise.se/blogg/teknik/2020/10/17/… 显示了过滤方法。而不是使用的租户,只需编写一个包含您的用户 ID 的查询(您可以使用
SecurityContextHolder来获取当前用户。 -
为什么不在每个与该用户无关的数据库查询中添加用户ID,无法执行操作,您可以抛出异常。
-
您还可以从 SecurityContextHolder 获取用户,您需要在验证用户时放置该用户。
标签: java spring spring-boot multi-tenant