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

保护多租户SaaS应用程序

尹雅健
2023-03-14

我正在使用Java、Spring、Struts2和Hibernate设计一个多租户SaaS Web应用程序。经过一些研究,我选择在共享数据库、共享模式、共享表的方法中实现多租户。并用tenantid标记每个db行。

我已经重写了我的应用程序,所以管理者和DAO将把tenantId作为一个参数,只为正确的数据库资源服务。

当获取信息时,这对所有视图来说都是完美的。也用于创建新的东西(使用登录的用户tenantId来存储信息)。

然而,对于更新和删除的东西,我不确定如何保护我的应用程序。例如:当用户想要编辑一个对象时,url将是:/edit?objectid=x,并将其映射到一个操作,该操作将根据ID检索该对象。这意味着任何登录用户都可以通过URL修改查看任何对象。我可以通过将tenantId添加到Dao来解决这个问题,因此如果用户试图查看其租户之外的对象,他将一无所获。

或者用户URL修改删除操作/delete?objectid=x

基本的,我需要一些方法来确保登录的用户有权访问任何他正在尝试做的事情。一切都很容易得到。只是把tenantId放在where子句中。但是对于更新和删除,我不确定该往哪个方向走。

我可以查询数据库的每一次更新和删除,以查看用户是否有权访问对象,但我正努力将数据库交互保持在最小。所以我发现对每一个这样的操作都进行额外的db调用是不切实际的。

共有1个答案

艾鹭洋
2023-03-14

读操作同样适用于写/更新:用户只能查看/访问/更改他们所拥有的内容。你的问题更多的是关于数据库的,而不是关于其他任何东西的。应用于查看数据的约束也必须应用于写入数据。

在这种情况下,您不希望首先使用查询的性能,然后使用更新的性能。这很好,因为您可以使用条件更新数据库。因为在您的情况下,这似乎是数据库级别的,所以您需要知道您的数据库能够做什么(一次完成)。例如,oracle有merge语句。

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

  • 我想知道如何为每个租户提供定制。我想提供在租户想要的每种形式中添加新字段的设施,包括字段名、数据类型等。现在我的问题是如何为这种类型的场景设计数据库表?正如我所想的那样,我们必须给每个表单赋予表单id,每当租户在表单中创建新字段时,应该在数据库表中创建一个新的行,该行应该具有租户id、表单id、字段名称、数据类型等... 现在请给我真正的解决方案的朋友......我需要这个数据库表设计解决方案立即

  • 我在租户A中有一个Azure广告B2C,在租户B中有一个SPA web应用程序(FE)和一个API函数应用程序(Node.js)。 FE正在使用MSAL要求使用Azure ADB2C登录。我希望在API中设置身份验证以接受FE的承载访问令牌。 我如何配置Azure来实现这一点?

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

  • 我们正在为奖励计划运行一个多租户SaaS应用程序。 目前,我们在数据库中分别管理每个租户的队列。 每个承租人可以有一个通知、奖励、bulk_operations队列。 我们知道这不是最好的方法和最好的做法。 我们正在计划扩展应用程序,我们需要以最好的方式设置队列和队列工作者。 任何建议都是很好的。我们对队列使用任何服务都持开放态度,如SQS、Redis等。我们需要为每个租户提供一个单独的队列。 [

  • 我目前正试图找出为我的系统设置多租户的最佳方法。我面临的问题是,租户并不总是必须是子域,但可以作为子域的一部分进行设置,子域可以有多个租户。我似乎在网上找不到任何东西可以帮助我在Laravel 6中进行设置。 系统要求: 一台服务器可以有许多子域 系统必须设置一个数据库,该数据库将使用tenant_id来确定哪些数据属于租户。 我目前正在以以下结构将所有子域数据存储在“subdomains”表中: