我正在Node / Mongoose + React中构建此多租户应用程序。我决定为所有用户提供一个数据库。
我有一个名为companies
的顶级集合,该集合存储公司的基本数据并具有company_id
。
[其他集合中的条目,例如users
,inventory
等,都通过此ID引用了它们所属的公司。例如,用户架构如下所示:
const UserSchema: mongoose.Schema = new mongoose.Schema({
email: {
type: String,
required: true,
},
password: { type: String, required: true, select: true },
role: { type: String, required: true },
company_id: { type: mongoose.Types.ObjectId }, //REFERENCE TO COMPANY
isVerified: { type: Boolean, required: true, default: false },
});
直到这里一切都很好。现在如何正确传递company_id以确保仅检索相关数据?例如。如果用户X属于公司A,则他只能看到公司A的库存。
我想我不确定步骤4:
用户登录。
他将获得一个JWT令牌,该令牌上具有company_id
信息。
company_id
传递给后端?考虑到这是一个GET请求,我假设它应该作为HTTP标头传递?还是后端应该解码每个请求附带的JWT并从那里检索company_id
?您最好为所有客户选择一个数据库。
但是,多租户应用程序必须彼此隐藏您不同客户的数据。如果可能,它们应该彼此隐藏彼此在您的应用程序中的真实存在。
您必须使用每个请求验证您的JWT或其他安全令牌,并且必须从该令牌中提取用户的身份和/或company_id。与每个请求。因为网络蠕变。
您的安全性令牌应该很难被欺骗。 “硬”表示“很难像正确地猜测一个160位随机数。”
您必须]]认为一个请求仅在请求中传递了用户ID或公司ID。对于看到请求的人来说应该是不可能的,例如
https://example.com/company/123
简单尝试
https://example.com/company/124
查看其他客户的数据。除非您想成为https://krebsonsecurity.com/上的专题文章的主题。 (您没有。)
最后,请记住,URL已记录在各种代理服务器中,您无法控制这些日志。您不应将敏感数据作为API路由的一部分或作为查询参数嵌入URL中。