Ana içeriğe atla

Kiracı Yönetimi İzninin Gizlenmesi

 Şimdi küçük bir sorunumuz var. Kullanıcı kiracı2'nin Yönetim:Güvenlik izni vardır , böylece kullanıcı ve rol izin diyaloglarına erişebilir. Böylece, izin kullanıcı arayüzünü kullanarak kendisine Yönetim:Kiracılar izni verebilir .

Tenant2 Kendine İzin Veriyor

Serenity, derlemelerinizi ReadPermission , WritePermission , PageAuthorize , ServiceAuthorize vb. gibi nitelikler açısından tarar ve bu izinleri izinleri düzenleme iletişim kutusunda listeler.

Öncelikle onu bu önceden doldurulmuş listeden kaldırmalıyız.

UserPermissionRepository.cs dosyasında ListPermissionKeys yöntemini bulun :

public ListResponse<string> ListPermissionKeys()
{
    return LocalCache.Get("Administration:PermissionKeys", TimeSpan.Zero, () =>
    {
        //...

        result.Remove(Administration.PermissionKeys.Tenants);
        result.Remove("*");
        result.Remove("?");
        
        //...

Artık bu izin Kullanıcı İzinlerini Düzenle veya Rol İzinlerini Düzenle iletişim kutusunda listelenmeyecek .

Ancak yine de UserPermissionRepository.Update veya RolePermissionRepository.Update yöntemlerini kullanarak küçük bir hackleme yaparak bu izni kendisine verebilir .

Bunu önlemek için bazı kontroller eklemeliyiz:

public class UserPermissionRepository
{
    public ITypeSource TypeSource { get; }
    public ISqlConnections SqlConnections { get; }

    public UserPermissionRepository(IRequestContext context, ITypeSource typeSource, ISqlConnections sqlConnections)
            : base(context)
    {
        TypeSource = typeSource ?? throw new ArgumentNullException(nameof(typeSource));
        SqlConnections = sqlConnections ?? throw new ArgumentNullException(nameof(sqlConnections));
    }
    
    public SaveResponse Update(IUnitOfWork uow, 
        UserPermissionUpdateRequest request)
    {
        //...
        var newList = new Dictionary<string, bool>(
            StringComparer.OrdinalIgnoreCase);
        foreach (var p in request.Permissions)
            newList[p.PermissionKey] = p.Grant ?? false;

        var allowedKeys = ListPermissionKeys(this.Cache, this.SqlConnections, this.TypeSource);
        if (newList.Keys.Any(x => !allowedKeys.Contains(x)))
            throw new AccessViolationException();
        //...

//...
using Serenity.Abstractions;
//...

public class RolePermissionRepository
{
    public ITypeSource TypeSource { get; }
    public ISqlConnections SqlConnections { get; }

    public RolePermissionRepository(IRequestContext context, ITypeSource typeSource, ISqlConnections sqlConnections)
            : base(context)
    {
        TypeSource = typeSource ?? throw new ArgumentNullException(nameof(typeSource));
        SqlConnections = sqlConnections ?? throw new ArgumentNullException(nameof(sqlConnections));
    }
    
    public SaveResponse Update(IUnitOfWork uow, 
        RolePermissionUpdateRequest request)
    {
        //...
        var newList = new HashSet<string>(
            request.Permissions.ToList(),
            StringComparer.OrdinalIgnoreCase);

        var allowedKeys = UserPermissionRepository
            .ListPermissionKeys(this.Cache, this.SqlConnections, this.TypeSource);
        if (newList.Any(x => !allowedKeys.Contains(x)))
            throw new AccessViolationException();
        //...

Burada verilmeye çalışılan yeni izin anahtarlarından herhangi birinin izin iletişim kutusunda listelenip listelenmediğini kontrol ediyoruz. Eğer öyleyse, bu muhtemelen bir hack girişimidir.

Aslında bu denetim, çok kiracılı sistemler olmasa bile varsayılan olmalıdır, ancak genellikle yönetici kullanıcılara güveniriz. Burada yöneticiler sadece kendi kiracılarını yönetecekler, dolayısıyla bu kontrole kesinlikle ihtiyacımız var.

Bu yeni ITypeSourcearayüzü yapıcıya ekledikten sonra ITypeSourceilgili depolara enjeksiyon için uç noktaları da güncellememiz gerekiyor.

RolePermissionEndpoint.cs

//...
using Serenity.Abstractions;
//...

[HttpPost, AuthorizeUpdate(typeof(MyRow))]
public SaveResponse Update(IUnitOfWork uow, RolePermissionUpdateRequest request,
    [FromServices] ITypeSource typeSource,
    [FromServices] ISqlConnections sqlConnections)
{
    return new MyRepository(Context, typeSource, sqlConnections).Update(uow, request);
}

public RolePermissionListResponse List(IDbConnection connection, RolePermissionListRequest request,
    [FromServices] ITypeSource typeSource,
    [FromServices] ISqlConnections sqlConnections)
{
    return new MyRepository(Context, typeSource, sqlConnections).List(connection, request);
}

UserPermissionEndpoint.cs

//...
using Serenity.Abstractions;
//...

[HttpPost, AuthorizeUpdate(typeof(MyRow))]
public SaveResponse Update(IUnitOfWork uow, UserPermissionUpdateRequest request,
    [FromServices] ITypeSource typeSource,
    [FromServices] ISqlConnections sqlConnections)
{
    return new MyRepository(Context, typeSource, sqlConnections).Update(uow, request);
}

public ListResponse<MyRow> List(IDbConnection connection, UserPermissionListRequest request,
    [FromServices] ITypeSource typeSource,
    [FromServices] ISqlConnections sqlConnections)
{
    return new MyRepository(Context, typeSource, sqlConnections).List(connection, request);
}

public ListResponse<string> ListRolePermissions(IDbConnection connection, UserPermissionListRequest request,
    [FromServices] ITypeSource typeSource,
    [FromServices] ISqlConnections sqlConnections)
{
    return new MyRepository(Context, typeSource, sqlConnections).ListRolePermissions(connection, request);

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