我在 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 是不切实际的。
有人对我的问题有任何提示或提示吗?