我不确定最好的路线是什么。我有一个客户,他的业务有3个不同的位置。每个地点的员工只能访问其位置数据。所有者可以访问所有...然后,不同的角色应该只能访问他们的东西(财务可以看到财务而不是销售等)。
最好的方法是什么?我能想到的解决方案是:
答案 0 :(得分:1)
将multi-tenancy
security model改造为现有数据库并不是一项简单的任务 - IMO应该从一开始就设计到模型中。
一个非常简单的模型(每个用户一个角色,每个用户一个位置)看起来像这样:
-- You need to add simple lookup tables for Role, Location
CREATE TABLE User
(
UserId INT, -- PK
RoleId INT, -- FK
LocationId INT NULL -- FK
);
所有敏感表都要么直接需要LocationId
分类,要么可以连接到具有LocationId
分类的表,即:
CREATE TABLE SomeTable -- with location-sensitive data
(
Col1 ... Col N,
LocationId INT
);
然而,困难的部分是调整敏感数据表上的所有系统查询,以便它们现在强制执行特定于位置的限制。这通常作为附加的谓词过滤器完成,该过滤器附加到在这些表上完成的查询的where子句,然后连接回用户位置表:
SELECT Col1 ... ColN
FROM SomeTable
INNER JOIN User on SomeTable.LocationId = User.LocationId
WHERE -- Usual Filter Criteria
AND ((User.UserId = @UserIdExecutingThisQuery
AND User.RoleId = `Finance`) -- Well, the Id for Finance
OR User.RoleId = `Administrator`) -- Well, the Id for Admin
作为重新设计工作的结果,作为短期解决方案,您可能会考虑维护3个不同的区域数据库(或同一数据库中的3个区域模式),然后使用复制或类似工具来集中所有数据到要使用的owner
角色的主数据库。
这将使您有时间重新设计数据库(和应用程序)以使用多租户设计。我建议一个更全面的模型,允许每个用户有多个角色,每个用户有多个位置(即很多连接表),而不是这里显示的简单模型。