我在Java,Spring,Struts2和Hibernate中挖掘多租户SaaS Web应用程序。经过一番研究,我选择在共享数据库,共享模式,共享表方法中实现多租户。并使用tenantId标记每个db-line。
我已经重写了我的应用程序,因此Managers和Dao将把tenantId作为参数来仅提供正确的数据库资源。
在获取信息时,这适用于所有视图。还用于创建新内容(使用登录用户tenantId来存储信息)。
但是,对于更新和删除内容,我不确定如何保护我的应用程序。
例如:当用户想要编辑对象时,网址将为:/edit?objectId=x
并且这将映射到将通过Id检索此对象的操作。意味着任何登录用户都可以通过url-modification查看任何对象。
这可以通过将tenantId添加到Dao中来解决,所以如果用户试图查看他租赁之外的对象,他什么也得不到。
好吧那好吧,但是在编辑表单中发送时呢?
如果用户修改了请求,弄乱了隐藏字段objectId
,那么操作将收到更改不属于用户租约的对象的请求。
或者,如果用户对修改删除操作/delete?objectId=x
基本上我需要一些方法来确保登录用户可以访问他想要做的任何事情。对于所有人来说,这很简单。只需将tenantId放在where子句中。 但是对于更新和删除,我不确定要走哪条路。
我可以查询db以获取每次更新并删除以查看用户是否可以访问该对象,但我正在尝试将db-interaction保持在最低限度。因此,我发现为每个此类操作进行额外的db调用是不切实际的。
有没有人对我的问题有任何提示或提示?
答案 0 :(得分:0)
阅读同样适用于写作/更新:用户只能看到/访问/更改他们拥有的内容。你的问题更多的是关于数据库的事情。您应用于查看数据的相同约束也必须适用于写入数据。
在这种情况下,您不希望先更新查询的性能。没关系,因为你可以用条件更新数据库。因为在您的情况下,这似乎可能是数据库级别,您需要知道您的数据库能够做什么(一次性完成)。例如,oracle具有merge语句。
答案 1 :(得分:0)
我这个帖子已经很晚了,也许你已经构建了你在这里问的解决方案。无论如何,我使用Spring Boot 2实现了一个基于数据库的租户多租户Web应用程序,并使用Spring Security 5保护了Web访问。数据访问是通过Spring JPA(Hibernate 5作为JPA提供程序)。看看here。