Öncelikle Kullanıcı Tanımı'nda kullanıcı kiracı bilgilerini yüklememiz ve önbelleğe almamız gerekiyor. Daha sonra Kullanıcı Taleplerine kullanıcı kiracı bilgilerini eklememiz gerekiyor.
Multitenancy.Web/Modules/Administration/User/Authentication altında UserDefinition.cs'yi açın ve bir TenantId özelliği ekleyin.
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; }
}
}
Bu, geçerli kullanıcıyı GetUserDefinition aracılığıyla istediğinizde döndürülen sınıftır .
Bu sınıfın yüklü olduğu kodu da değiştirmemiz gerekiyor. Aynı klasörde UserRetrieveService.cs dosyasını düzenleyin ve GetFirst yöntemini aşağıdaki gibi değiştirin:
private UserDefinition GetFirst(IDbConnection connection, BaseCriteria criteria)
{
var user = connection.TrySingle<MyRow>(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;
}
Daha sonra kiracı kimliği talebini CreatePrincipal yöntemine ekleyin.
public static ClaimsPrincipal CreatePrincipal(IUserRetrieveService userRetriever, string username, string authType)
{
if (userRetriever is null)
throw new ArgumentNullException(nameof(userRetriever));
if (username is null)
throw new ArgumentNullException(nameof(username));
var user = (UserDefinition)userRetriever.ByUsername(username);
if (user == null)
throw new ArgumentOutOfRangeException(nameof(username));
if (authType == null)
throw new ArgumentNullException(nameof(authType));
var identity = new GenericIdentity(username, authType);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id));
identity.AddClaim(new Claim("TenantId", user.TenantId.ToInvariant())); // add tenant id claim
return new ClaimsPrincipal(identity);
}
Kiracı kimliği talebine erişmek için ClaimsPrincipal sınıfına yönelik şu şekilde bir uzantı yöntemi oluşturabiliriz:
using System;
using System.Linq;
using System.Security.Claims;
namespace MultiTenancy
{
public static class ClaimsPrincipalExtensions
{
public static int GetTenantId(this ClaimsPrincipal user)
{
if(user is null)
throw new ArgumentNullException(nameof(user));
var tenantClaim = user.Claims.FirstOrDefault(x => x.Type == "TenantId");
if (tenantClaim is null)
throw new NullReferenceException("TenantId claim not found");
return int.Parse(tenantClaim.Value);
}
}
}
Artık listelenen kullanıcıları TenantId'e göre filtrelemenin zamanı geldi . UserListHandler.cs dosyasını açın , UserListHandler sınıfını bulun ve şu şekilde değiştirin:
public class UserListHandler : ListRequestHandler<MyRow, MyRequest, MyResponse>, IUserListHandler
{
public UserListHandler(IRequestContext context)
: base(context)
{
}
protected override void ApplyFilters(SqlQuery query)
{
base.ApplyFilters(query);
if (Permissions.HasPermission(PermissionKeys.Tenants))
return;
query.Where(MyRow.Fields.TenantId == User.GetTenantId());
}
//...
}
Burada öncelikle kayıtlı kullanıcı taleplerinden kiracı kimliğini alıyoruz. Daha sonra kullanıcıları kiracı kimliğine göre filtreliyoruz. Bu durumda tüm kullanıcıların TenantId değere sahip olması gerekir, aksi takdirde bir istisna ortaya çıkar.
Sonunda yalnızca yöneticinin sahip olacağı kiracı yönetimi iznine sahip olup olmadığını kontrol ediyoruz . Değilse, listelenen kayıtları TenantId'ye göre filtreleriz .