2012-05-09 80 views
0

我在Java,Spring,Struts2和Hibernate中使用多租户SaaS Web应用程序。经过一些研究,我选择在共享数据库,共享模式,共享表方法中实现多租户。并用tenantId标记每个db-line。确保多租户SaaS应用程序的安全

我已经重写了我的应用程序,因此经理和Dao会将tenantId作为参数来仅提供正确的db资源。

这对于获取信息时的所有视图都非常适用。也用于创建新的东西(使用登录用户tenantId来存储信息)。

但是,更新和删除的东西,我不知道如何保护我的应用程序。 例如:当用户想要编辑一个对象时,URL将为:/edit?objectId=x 并将其映射到将通过Id检索此对象的操作。意思是任何登录的用户都可以通过url-modification查看任何对象。 这可以通过将tenantId添加到Dao来解决,因此如果用户尝试查看他租赁范围之外的对象,他将得不到任何东西。

好吧,那好吧,但关于何时发送编辑表单? 如果用户修改请求,则会隐藏隐藏字段objectId,以便操作将收到请求以更改不属于用户租期的对象。

或者,如果用户的URL,修改删除操作/delete?objectId=x

Basicly我需要确保登录的用户可以访问到任何他想要做的一些方法。为了所有得到它的容易。把tenantId放在where子句中。 但是,对于更新和删除,我不知道要走什么方向。

我可以查询数据库的每个更新和删除,看看用户是否有权访问该对象,但我试图保持数据库交互到最低限度。所以我觉得为每一个这样的动作做一个额外的数据库调用是不切实际的。

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

回答

0

阅读方面的内容同样适用于书写/更新:用户只能看到/访问/更改他们自己的内容。你的问题更多的是关于其他任何数据库。您应用于查看数据的相同约束条件也必须适用于写入数据。

在这种情况下,您不希望先磨损查询的性能,然后再更新。这很好,因为您可以使用条件更新数据库。由于这可能是数据库级别,因此您需要知道数据库的功能(一次完成)。例如,oracle有合并语句。