0

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

我已经重写了我的应用程序,因此 Managers 和 Dao 将把tenantId 作为参数来只提供正确的数据库资源。

这在获取信息时非常适合所有视图。并且还用于创建新内容(使用登录的用户tenantId 来存储信息)。

但是,对于更新和删除内容,我不确定如何保护我的应用程序。例如:当用户想要编辑一个对象时,url 将是:/edit?objectId=x 这被映射到一个动作,该动作将通过 Id 检索这个对象。这意味着任何登录的用户都可以通过 url-modification 查看任何对象。我可以通过将tenantId 添加到 Dao 来解决这个问题,因此如果用户试图查看其租户之外的对象,他将一无所获。

好的,那没关系,但是关于在编辑表单中发送时?如果用户修改了请求,弄乱了隐藏字段objectId,那么操作将收到更改不属于用户租户的对象的请求。

或者如果用户 url 修改了删除操作/delete?objectId=x

基本上我需要某种方式来确保登录用户可以访问他正在尝试做的任何事情。对于所有人来说都很容易。只需将tenantId 放在where 子句中即可。但是对于更新和删除,我不确定该往哪个方向发展。

我可以查询数据库的每次更新和删除以查看用户是否有权访问该对象,但我试图将 db-interaction 保持在最低限度。因此,我发现为每个此类操作进行额外的 db-call 是不切实际的。

有人对我的问题有任何提示或提示吗?

4

2 回答 2

0

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

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

于 2012-05-25T07:40:51.510 回答
0

我对这个线程很晚了,也许你已经构建了你在这里询问的解决方案。无论如何,我已经使用 Spring Boot 2 实现了一个每租户数据库的多租户 Web 应用程序,并使用 Spring Security 5 保护了 Web 访问。数据访问是通过 Spring JPA(使用 Hibernate 5 作为 JPA 提供程序)。一定要看看这里

于 2018-04-12T18:54:15.483 回答