多租户系统 - 使用 TenantId 筛选用户

优质
小牛编辑
131浏览
2023-12-01

我们首先需要在 UserDefinition 加载并缓存租户用户。

打开 Multitenancy.Web/ Modules/ Administration/ User/ Authentication 下的 UserDefinition.cs,并添加 TenantId 属性。

  1. namespace MultiTenancy.Administration
  2. {
  3. using Serenity;
  4. using System;
  5. [Serializable]
  6. public class UserDefinition : IUserDefinition
  7. {
  8. public string Id { get { return UserId.ToInvariant(); } }
  9. public string DisplayName { get; set; }
  10. public string Email { get; set; }
  11. public short IsActive { get; set; }
  12. public int UserId { get; set; }
  13. public string Username { get; set; }
  14. public string PasswordHash { get; set; }
  15. public string PasswordSalt { get; set; }
  16. public string Source { get; set; }
  17. public DateTime? UpdateDate { get; set; }
  18. public DateTime? LastDirectoryUpdate { get; set; }
  19. public int TenantId { get; set; }
  20. }
  21. }

当你通过 Authorization.UserDefinition 请求当前用户时,该类被返回。

我们也需要在类被加载的地方修改代码。在同一文件夹编辑 UserRetrieveService.cs,并修改 GetFirst

  1. private UserDefinition GetFirst(IDbConnection connection, BaseCriteria criteria)
  2. {
  3. var user = connection.TrySingle<Entities.UserRow>(criteria);
  4. if (user != null)
  5. return new UserDefinition
  6. {
  7. UserId = user.UserId.Value,
  8. Username = user.Username,
  9. Email = user.Email,
  10. DisplayName = user.DisplayName,
  11. IsActive = user.IsActive.Value,
  12. Source = user.Source,
  13. PasswordHash = user.PasswordHash,
  14. PasswordSalt = user.PasswordSalt,
  15. UpdateDate = user.UpdateDate,
  16. LastDirectoryUpdate = user.LastDirectoryUpdate,
  17. TenantId = user.TenantId.Value
  18. };
  19. return null;
  20. }

现在,是时候使用 TenantId 过滤并列出用户。打开 UserRepository.cs,定位到 MyListHandler 类做如下修改:

  1. private class MyListHandler : ListRequestHandler<MyRow>
  2. {
  3. protected override void ApplyFilters(SqlQuery query)
  4. {
  5. base.ApplyFilters(query);
  6. var user = (UserDefinition)Authorization.UserDefinition;
  7. if (!Authorization.HasPermission(PermissionKeys.Tenants))
  8. query.Where(fld.TenantId == user.TenantId);
  9. }
  10. }

在这里,我们先获得当前登录用户的缓存用户定义。

我们检查该用户是否有租户管理权限,该权限只被授予给 admin 。如果没有,我们使用 TenantId 过滤列表记录。