当前位置: 首页 > 知识库问答 >
问题:

如何处理Spring Boot应用程序中的多租户问题?

孟英叡
2023-03-14

假设我有一个SpringBoot应用程序,具有以下需求。

  1. 它有一个用户类(实体)
  2. 每个用户有零个或多个工作区(一对多实体关系)
  3. 每个工作区具有零个或多个工作项(一对多实体关系)
    null

现在有要求...

  1. 用户只能创建/编辑/删除自己的工作区实体
  2. 用户只能在自己的工作区
  3. 中创建/编辑/删除 工作项实体

另外,假设user实体与SpringSecurity集成,并且我们知道contoller和服务中的当前用户。

class PermissionManager {
   void checkUserAllowedToUseWorkspace(User u, Workspace w);
   void checkUserAlloweToUseWorkitem(User u, WorkItem)
}

正如您所看到的…随着作用域资源的数量的增加…这个类将会变得非常臃肿并且很难维护。

有没有人知道一种更好的方法来以一种干净和可维护的方式进行这种范围内的资源访问?

共有1个答案

颜瀚漠
2023-03-14

对工作区实体的一些数据库查询:

// DELETE
@Transactional
void deleteByIdAndUserId(String workspaceId, String userId);

userRepository.deleteByIdAndUserId(workspaceId, userId);


// UPDATE
Optional<Workspace> workspace = workspace.findByIdAndUserId(String workspaceId, String userId);

Workspace workspace = workspace.orElseThrow(() -> new RuntimeException("You don't have an workspace under user "))

workspace.setName("MyWorkspace2");

//CREATE
User user = userRepository.findById(SecurityContextHolder...getPriciple().getId())
              .orElseThrow(() -> new RuntimeException("User can not be found by given id"));
workspaceRepository.save(WorkspaceBuilder.builder().user(user).name("firstWorkspace").build());
 类似资料:
  • 我有两个来自不同组织(租户)的SharePoint网站: 房客1:abc.sharepoint.com 房客2:xyz.sharepoint.com 已在azure portal for Tenan 1'abc上注册并授予应用程序所需的权限。sharepoint。com”,以便租户2用户可以访问它:“xyz”。sharepoint。com' 认证工作正常 当我与租户1的abc用户进行身份验证时,对

  • 我必须在j2ee中开发一个多租户SaaS应用程序,从Iaas和PaaS开始实现三种云模型,我选择了openstack和openshift origin。SaaS应用程序的第一个标准是多租户,我知道有三种方法来实现它——单独的数据库——共享数据库,单独的模式——共享数据库,共享模式。我在这里迷失了方向,因为许多框架,比如ATHENA,ORM,比如hibernate,还有TOPLINK。我需要帮助了解

  • 我已经安装了keycloak-angular包,我使用它的方式如下:https://www.npmjs.com/package/keycloak-angular 问题是,在我的应用程序中,我希望有多租户。这意味着在应用程序加载期间不知道领域名。 在说明中,它说“KeycloakService应该在应用程序加载期间使用APP_INITIALIZER标记初始化”,问题是该领域是由用户给定的,在应用程序

  • 我正在学习多租户应用程序,以及如何使用PostgreSQL的模式来实现这一点。 在研究这个主题时,我发现了一篇文章,作者描述了在多租户应用程序中使用PostgreSQL模式时的糟糕体验。主要问题是迁移性能差和数据库资源使用率高。 似乎只有一个模式(在租户之间共享表)会比每个租户有一个单独的模式带来更好的性能。但我觉得很奇怪。我的想法正好相反,因为较小表上的索引往往比较大表上的索引轻。 为什么在许多

  • 目前,我正面临一个技术决策,我个人无法找到解决方案。 我目前正在开发一个多租户数据库。 结构如下: 有一个核心数据库,用于保存特定租户的数据和关系 有多个租户数据库实例(通过核心数据库中的查询,可以确定我应该连接到哪个租户id) 每个租户都位于一个单独的数据库实例(位于单独的服务器上) 每个租户都有特定的数据,其他租户都不应访问这些数据 每个数据库最好是mySQL(但如果有更好的选择,我愿意接受建