多租户系统 - 使用 TenantId 筛选用户
优质
小牛编辑
136浏览
2023-12-01
我们首先需要在 UserDefinition 加载并缓存租户用户。
打开 Multitenancy.Web/ Modules/ Administration/ User/ Authentication 下的 UserDefinition.cs,并添加 TenantId 属性。
namespace MultiTenancy.Administration
{
using Serenity;
using System;
[Serializable]
public class UserDefinition : IUserDefinition
{
public string Id { get { return UserId.ToInvariant(); } }
public string DisplayName { get; set; }
public string Email { get; set; }
public short IsActive { get; set; }
public int UserId { get; set; }
public string Username { get; set; }
public string PasswordHash { get; set; }
public string PasswordSalt { get; set; }
public string Source { get; set; }
public DateTime? UpdateDate { get; set; }
public DateTime? LastDirectoryUpdate { get; set; }
public int TenantId { get; set; }
}
}
当你通过 Authorization.UserDefinition 请求当前用户时,该类被返回。
我们也需要在类被加载的地方修改代码。在同一文件夹编辑 UserRetrieveService.cs,并修改 GetFirst:
private UserDefinition GetFirst(IDbConnection connection, BaseCriteria criteria)
{
var user = connection.TrySingle<Entities.UserRow>(criteria);
if (user != null)
return new UserDefinition
{
UserId = user.UserId.Value,
Username = user.Username,
Email = user.Email,
DisplayName = user.DisplayName,
IsActive = user.IsActive.Value,
Source = user.Source,
PasswordHash = user.PasswordHash,
PasswordSalt = user.PasswordSalt,
UpdateDate = user.UpdateDate,
LastDirectoryUpdate = user.LastDirectoryUpdate,
TenantId = user.TenantId.Value
};
return null;
}
现在,是时候使用 TenantId 过滤并列出用户。打开 UserRepository.cs,定位到 MyListHandler 类做如下修改:
private class MyListHandler : ListRequestHandler<MyRow>
{
protected override void ApplyFilters(SqlQuery query)
{
base.ApplyFilters(query);
var user = (UserDefinition)Authorization.UserDefinition;
if (!Authorization.HasPermission(PermissionKeys.Tenants))
query.Where(fld.TenantId == user.TenantId);
}
}
在这里,我们先获得当前登录用户的缓存用户定义。
我们检查该用户是否有租户管理权限,该权限只被授予给 admin 。如果没有,我们使用 TenantId 过滤列表记录。