我有一个JSP / MySQL网络服务,用户可以与“流程”进行交互 - 他们可以为给定流程上传数据,配置,查看报告等。他们还可以创建新流程或运行比较多个流程的报告。
目前,在URL(GET参数)中指定了进程ID,因此任何用户都可以与任何进程进行交互。 我被要求为此服务添加安全性和多租户。为简单起见,假设每个租户都可以完全访问一组流程,但多个租户可以访问流程。
我的首选方法:
我的老板认为这不足以“满足”外部代码审核。他担心任性的开发人员仍然可以编写一个查询,将一个客户的数据暴露给另一个客户或其他什么。
他希望我也使用ANSI SQL内置的ROLES(应用程序必须保持数据库不可知)为每个用户创建一个db角色。该角色将详细说明角色可以访问哪些表,共享表中的哪些行等。这样,在登录时,Connection将是“安全的”,并且没有开发人员错误可能导致问题。
答案 0 :(得分:1)
这是我为具有单个数据库的MySQL多租户所做的工作,以确保数据是私有的:
由于该应用程序使用的是租户的mysql用户,因此他们不可能无意间获取另一个租户的数据。
我能够在周末以最少的更改将大型单租户mysql应用程序转换为多租户。我在此处记录了该设计:https://opensource.io/it/mysql-multi-tenant/
答案 1 :(得分:0)
使用PostgreSQL,因为它支持真实的模式,不像MySQL
如果您必须使用MySQL,请执行以下操作:
tenant
VARCHAR(16)NOT NULL 现在用户只能看到自己的租户信息。
答案 2 :(得分:0)
我们在so question上就多租户安全和处理请求进行了类似的讨论。但总之,我认为将tenantID存储在会话中是一个巨大的安全风险。用户可以从一个租户转到另一个租户,tenantID将保持不变,tenantID也不应该通过url发送。