Veri izinlerini tanımlama

Fabric Apps, yetkilendirme kurallarını doğrudan veri modellerinize eklemek için @role dekoratörunu kullanır. İzinler tür güvenliğine sahiptir, yeniden düzenlemeye elverişlidir ve otomatik olarak altyapıdaki veri erişim yapılandırmasına derlenir.

Başlamadan önce

Yerleşik roller

Fabric Uygulamaları yerleşik authenticated rolünü tanır. Gerektiğinde ilkelerinizde özel roller de tanımlayabilirsiniz.

Rolü Açıklama Kullanım örneği
authenticated Fabric kimlik doğrulamasıyla geçerli bir kullanıcı oturumu gerektirir Kullanıcıya özgü veriler, korumalı kaynaklar

Dekoratör @role

Bir varlıkta hangi rollerin hangi eylemleri gerçekleştirebileceğini denetlemek için sınıf düzeyinde uygulayın @role :

@role(roleName, actions, options?)

Parameters

Parametre Türü Açıklama
roleName string Veya özel uygulama rolü gibi 'authenticated' rol adı
actions string \| string[] Tek eylem veya dizi: 'create', 'read', 'update', 'delete', veya '*' tümü için
options object , checkve include özelliklerine sahip excludeisteğe bağlı nesne

Temel örnek

Kimliği doğrulanmış kullanıcıları kendi verileriyle kısıtlayın:

import { entity, role, uuid, text } from '@microsoft/rayfin-core';

@entity()
@role('authenticated', ['create', 'read', 'update', 'delete'], {
  policy: (claims, item) => claims.sub.eq(item.userId),
})
export class Todo {
  @uuid() id!: string;
  @text() title!: string;
  @text({ optional: true }) description?: string;
  @text() userId!: string;
}

Bu örnekte:

  • Kimliği doğrulanmış kullanıcılar yalnızca userId değeri kendi JWT sub claim’leriyle eşleşen Todo öğelerine erişebilir.

Tür açısından güvenli ilke ifadeleri

Geri policy arama, hem taleplere hem de varlık alanlarına türlenmiş erişim sağlar. TypeScript, dekore edilmiş sınıftan varlık türünü çıkararak size otomatik tamamlama ve yeniden düzenleme güvenliği sağlar:

policy: (claims, item) => claims.sub.eq(item.userId)

Desteklenen talepler

İddia Açıklama Örnek değer
claims.sub Konu tanımlayıcısı (kullanıcı kimliği) 00000000-0000-0000-0000-000000000001
claims.email Kullanıcı e-posta adresi user@contoso.com
claims.role Kullanıcı rolü (kimlik sağlayıcısı tarafından sağlanıyorsa) admin

İfade işleçleri

Operator Example Açıklama
.eq() claims.sub.eq(item.userId) Eşitlik denetimi

Mantıksal işleçler

İfadeleri .and() ve .or() ile birleştirin:

// User must own the item AND item must be active
@role('authenticated', 'read', {
  policy: (claims, item) =>
    claims.sub.eq(item.userId).and(item.isActive.eq(true))
})

// User is admin OR user owns the item
@role('authenticated', ['update', 'delete'], {
  policy: (claims, item) =>
    claims.role.eq('admin').or(claims.sub.eq(item.ownerId))
})

Doğru gruplandırma için iki taraf da otomatik olarak parantez içine alınır.

Alan düzeyinde izinler

Rol seçeneklerinde, include veya exclude kullanarak rolün erişebileceği alanları belirtin.

Belirli alanları ekle

Yalnızca oluşturma işlemleri sırasında title alanına izin verin:

@entity()
@role('authenticated', 'create', {
  policy: (claims, item) => claims.sub.eq(item.createdBy),
  include: ['title'],
})
export class Document {
  @uuid() id!: string;
  @text() title!: string;
  @text({ optional: true }) content?: string;
  @text() createdBy!: string;
}

Belirli alanları hariç tutma

Hassas alanları okuma işlemlerinden gizle:

@entity()
@role('authenticated', 'read', {
  exclude: ['lastLogin', 'passwordHash'],
})
export class User {
  @uuid() id!: string;
  @text() email!: string;
  @date({ optional: true }) lastLogin?: Date;
  @text() passwordHash!: string;
}

Uyarı

Alan dizileri varlığın gerçek özellik adlarına yazılır. Bir alanı yeniden adlandırmak, ona başvuran her include veya exclude listede derleme zamanı hatası oluşturur.

Eyleme özgü izinler

Birden çok @role dekoratör kullanarak eylem başına farklı kurallar uygulayın:

@entity()
@role('authenticated', 'create', {
  policy: (claims, item) => claims.sub.eq(item.createdBy),
  include: ['title', 'content'],
})
@role('authenticated', 'read', {
  policy: (claims, item) => claims.sub.eq(item.createdBy),
})
@role('authenticated', 'update', {
  policy: (claims, item) => claims.sub.eq(item.createdBy),
  exclude: ['adminNotes'],
})
@role('authenticated', 'delete', {
  policy: (claims, item) => claims.sub.eq(item.createdBy),
})
export class SecureDocument {
  @uuid() id!: string;
  @text() title!: string;
  @text({ optional: true }) content?: string;
  @text({ optional: true }) adminNotes?: string;
  @text() createdBy!: string;
}

Bu yapılandırma:

  • Oluşturma: Yalnızca oluşturucu oluşturabilir ve yalnızca title ve content alanlara izin verilir.
  • Okuma: Yalnızca oluşturucu kendi belgelerini okuyabilir.
  • Güncelleştirme: Yalnızca oluşturucu güncelleştirebilir, ancak değiştiremez adminNotes.
  • Sil: Yalnızca oluşturucu silebilir.

İzinler nasıl çalışır?

  • Meta veri koleksiyonu: Sınıf @role tanımlandığında dekoratör izin meta verilerini toplar.
  • Şema oluşturma: komutunu çalıştırdığınızda db apply, CLI meta verileri okur ve izin yapılandırması oluşturur.
  • İlke derleme: TypeScript ilkesi geri çağırmaları veri erişim ilkesi ifadelerinde derlenir (örneğin, @claims.sub eq @item.userId).
  • Çalışma zamanı zorlaması: Veri erişim katmanı her API isteğinde izinleri zorlar.
  • Çakışma algılama: Aynı sınıftaki birden çok @role dekoratör, çakışan bildirimlere yönelik uyarılarla birlikte rol başına toplanır.

Ortak desenler

Yalnızca sahibine erişim

@entity()
@role('authenticated', '*', {
  policy: (claims, item) => claims.sub.eq(item.ownerId)
})
export class PrivateNote {
  @uuid() id!: string;
  @text() ownerId!: string;
  @text() content!: string;
}

Kimliği doğrulanmış kullanıcılar için tam erişim

@entity()
@role('authenticated', '*')
export class BlogPost {
  @uuid() id!: string;
  @text() title!: string;
  @text() content!: string;
}

Yönetici tarafından geçersiz kılma

@entity()
@role('authenticated', ['create', 'read', 'update'], {
  policy: (claims, item) =>
    claims.role.eq('admin').or(claims.sub.eq(item.ownerId))
})
@role('authenticated', 'delete', {
  policy: (claims, _item) => claims.role.eq('admin')
})
export class ManagedResource {
  @uuid() id!: string;
  @text() ownerId!: string;
  @text() name!: string;
}

Yöneticiler herhangi bir kaynağı değiştirebilir, ancak yalnızca yöneticiler silebilir.

Sonraki Adımlar