Ana içeriğe atla

Kullanıcıları TenantId'e Göre Filtreleme

 Ö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 .

Bu blogdaki popüler yayınlar

Code generetor ile oluşturulan dosyaların açıklamaları

  1. Sunum (Presentation/UI) Katmanı (Kullanıcı arayüzü - HTML, TypeScript, Dialog, Grid) 🔹 XYZPage.ts 📌 Ne İşe Yarar? Kullanıcı arayüzünün TypeScript tarafındaki tanımıdır. Serenity'nin Dialog ve Grid bileşenlerini içeren bir TypeScript sınıfıdır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcıdan veri almak ve göstermek için kullanılır. 🔹 XYZGrid.ts 📌 Ne İşe Yarar? Tablo (Grid) yapısını oluşturur ve verileri listeler. Filtreleme, sıralama ve sayfalama işlemleri için kullanılır. columnsKey ile hangi kolonların gösterileceğini belirler. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcının verileri listelediği ve etkileşimde bulunduğu yerdir. 🔹 XYZDialog.ts 📌 Ne İşe Yarar? CRUD (Create, Read, Update, Delete) işlemlerini yöneten pencere (modal) bileşeni Kullanıcı form aracılığıyla veri ekler, günceller veya siler. XYZForm.cs ile birlikte çalışır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kull...

Serenity Web Nedir?

   Serenity  , açık kaynak teknolojileri üzerine kurulu bir ASP.NET Core/TypeScript uygulama platformudur. Standart kodlardan kaçınarak, tekrarlanan görevlere harcanan zamanı azaltarak ve en iyi yazılım tasarımı uygulamalarını uygulayarak bakım maliyetlerini düşürürken geliştirmeyi kolaylaştırmayı amaçlamaktadır. Serene  , Serenity platformunu temel alan ücretsiz, açık kaynaklı başlangıç ​​uygulama şablonumuzdur.  Bu dokümantasyon aracılığıyla eğitimimiz ve diğer örnekler için esas olarak Serene'yi kullanacağız. StartSharp  , ücretli müşterilerimize sunduğumuz premium uygulama şablonudur.  Daha gösterişli bir temaya ve bazı ekstra özelliklere  ek olarak Serene'deki her şeyi içerir  .  İkisi de Serenity platformunu temel alıyor. Adında Ne Var Serenity'nin sözlük anlamları  barış  ,  rahatlık  ve  sakinliktir  . Serenity ile bunu başarmaya çalışıyoruz.  Umarız yükledikten ve kullandıktan sonra siz de bu ş...