我正在尝试创建一个多租户系统,到目前为止,在保存方面一切正常。但早些时候,我偶然发现了一个问题,我有这项服务:
public interface EmployeeService : IEmployeeService
{
private IEmployeeRepository _employeeRepository;
public EmployeeService(IEmployeeRepository employeeRepository)
{
_employeeRepository= employeeRepository;
}
public Employee GetById(int employeeId)
{
return _employeeRepository.GetById(employeeId);
}
}
因此,从MVC Controller调用此服务以检索具有Id的员工。问题是我希望能够检查在呼叫期间传递的employeeId是否由正在调用它的租户拥有,否则他可以在其中放入任何Id并检索任何人。
我能想到的最简单的解决方案是更改签名以包含tenantId:
public Employee GetById(int tenantId, int employeeId)
但我在想是否有更好的方法。我觉得GetById方法应该只有1个参数。也许我在思考它,我不确定。
我可以想到的另一种方式是,如果EmployeeService有一个成员TenantId,在实例化时,TenantId会在调用GetById之前填充并使用,以检查它是否拥有正在检索的employeeId。但我无法做到这一点,因为EmployeeService是在ConfigureService的Startup期间创建的,只有在有人成功登录后我才会知道TenantId。
答案 0 :(得分:1)
您应该动态地在DBContext中过滤tenantId。这里有一个有用的帖子。
您可以创建一个类似ITenantEntity的界面,它可以实现给其他拥有TenantId的实体。
public interface ITenantEntity
{
public int TenantId { get; set; }
}
在DbContext级别,您可以使用ITenantFilter
确定具有租约的实体,并且可以动态过滤它们。
此外,您不应手动将TenantId过滤器传递给方法,因为它很难管理。您可以将TenantId存储为 ClaimsPrincipal 。您应该在用户身份验证后设置TenantId,并且可以动态地从每个请求获取TenantId作为声明。 我们使用相同的方法来管理项目中的多租户。实际上,这是一个完美的解决方案。