如何确定子女或孙子班是否需要租户ID



假设您有一个Tenant,它有许多用户,有许多帐户,有许多交易。

你在树的下面添加一个TenantId属性有多远
您在树的下面添加一个UserId
还是您只需要拥有父id?

假设用户在不首先访问子实体的父实体的情况下,永远不会有意访问该子实体。在蛞蝓中,它可能类似于:baseurl.com/accounts/{accountId/transactions/{transactionId}

public class Tenant
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
public virtual ICollection<Transaction> Transactions { get; set; }
}
public class User
{
public long Id { get; set; }
public long TenantId { get; set; }
public string Name { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
}
public class Account
{
public long Id { get; set; }
public long TenantId { get; set; }
public string UserId { get; set; }
public virtual ICollection<Transaction> Transactions { get; set; }
}
public class Transaction
{
public long Id { get; set; }
public long TenantId { get; set; }
public string UserId { get; set; }
public string AccountId { get; set; }
}

我经常看到在所有租户下使用TenantId的例子。我想这是为了安全起见,但我的自然假设是UserId就足够了。例如,即使Transaction比User低两级,我也不认为我应该允许任何知道Transaction ID的人在不同时是拥有该帐户的用户的情况下访问交易。

我们添加TenantId所遵循的规范是所有主要实体。例如,用户和帐户应该具有TenantId。由于交易是用户和账户的依赖实体,因此无法在不引用基础(账户/用户(的情况下提取交易,因此租户ID没有任何授权。

经验法则是对要由租户分组/分类的主要业务实体进行分类。(用户、帐户等(,以便在数据库中检索或更新数据时,在对映射或子表执行任何操作之前进行正确的租户筛选。因此,基于域对象,请明智地包含TenantId列。

最新更新