Määrittele dataoikeudet

Fabric Apps käyttää @role decoratoria liittääkseen valtuutussäännöt suoraan datamalleihisi. Käyttöoikeudet ovat tyyppiturvallisia, refaktorointiystävällisiä ja ne käännetään automaattisesti taustalla olevaan datan käyttökonfiguraatioon.

Alkuvalmistelut

Sisäiset roolit

Fabric Apps tunnistaa sisäänrakennetun authenticated-roolin. Voit myös määritellä omia rooleja politiikkoihisi tarpeen mukaan.

Role Description Käyttötapaus
authenticated Vaatii kelvollisen käyttäjäsession Fabric-todennuksella Käyttäjäkohtaiset tiedot, suojatut resurssit

Sisustaja @role

Hae @role luokkatasolla hallitaksesi mitkä roolit voivat suorittaa mitäkin toimintoja jollain entiteetillä:

@role(roleName, actions, options?)

Parametrit

Parametri Tyyppi Description
roleName string Roolinimi, kuten 'authenticated' tai mukautettu sovellusrooli
actions string \| string[] Yksitoiminen tai taulukko: 'create', , 'delete''read''update', , tai '*' kaikille
options object Valinnainen objekti, jossa checkon , include, ja exclude ominaisuudet

Perusesimerkki

Rajoita todennetut käyttäjät heidän omiin tietoihinsa:

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;
}

Tässä esimerkissä:

  • Todennetut käyttäjät pääsevät käsiksi vain Todo-esineisiin, jotka userId vastaavat heidän JWT-vaatimustaan sub .

Tyypin turvalliset politiikkalausekkeet

Callback policy tarjoaa tyypitetyn pääsyn sekä väitteisiin että entiteettikenttiin. TypeScript päättelee entiteettityypin koristellusta luokasta, jolloin saat automaattisen suorituksen ja refaktoroinnin turvallisuuden:

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

Tuetut väitteet

Vaatimus Description Esimerkkiarvo
claims.sub Aihetunniste (käyttäjätunnus) 00000000-0000-0000-0000-000000000001
claims.email Käyttäjän sähköpostiosoite user@contoso.com
claims.role Käyttäjän rooli (jos identiteettipalveluntarjoaja on tarjonnut) admin

Lausekeoperaattorit

Operaattori Esimerkki Description
.eq() claims.sub.eq(item.userId) Tasa-arvotarkastus

Loogiset operaattorit

Yhdistä lausekkeet ja .and().or():

// 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))
})

Molemmat puolet on automaattisesti sulkuissa oikeaa ryhmittelyä varten.

Kenttätason käyttöoikeudet

Määritä kentät, joihin rooli pääsee käsiksi roolivalinnoissa include tai exclude rooliasetuksissa.

Sisällytä tietyt kentät

Salli kenttä title vain luontitoimintojen aikana:

@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;
}

Sulje pois tietyt kentät

Piilota herkät kentät lukutoiminnoilta:

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

Note

Kenttätaulukot tyypitetään entiteettien todellisten ominaisuuksien nimien mukaan. Kentän uudelleennimeäminen aiheuttaa käännösaikavirheen jokaisessa include tai exclude -listassa, joka viittaa siihen.

Toimintokohtaiset oikeudet

Sovella eri sääntöjä per toiminto useiden @role sisustajien avulla:

@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;
}

Tämä kokoonpano:

  • Luo: Vain luoja voi luoda, ja vain title ja content kentät ovat sallittuja.
  • Lue: Vain tekijä voi lukea omia dokumenttejaan.
  • Päivitys: Vain tekijä voi päivittää, mutta he eivät voi muokata adminNotes.
  • Poista: Vain tekijä voi poistaa.

Miten käyttöoikeudet toimivat

  • Metatietojen keruu: Sisustaja @role kerää käyttöoikeusmetatietoja, kun luokka määritetään.
  • Skeeman generointi: Kun suoritat db apply, CLI lukee metatietoja ja generoi käyttöoikeusasetukset.
  • Politiikan kääntäminen: TypeScript-politiikan callbackit käännetään datan käyttöpolitiikkalausekkeiksi (esim. @claims.sub eq @item.userId).
  • Ajonaikainen valvonta: Datan käyttökerros valvoo oikeuksia jokaisessa API-pyynnössä.
  • Ristiriitojen tunnistus: Useita @role sisustajia samassa luokassa on koottu per rooli, ja ristiriitaisista ilmoituksista varoitetaan.

Yleiset mallit

Vain omistajalle tarkoitettu pääsy

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

Täysi pääsy todennetuille käyttäjille

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

Järjestelmänvalvojan ohitus

@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;
}

Ylläpitäjät voivat muokata mitä tahansa resurssia, mutta vain ylläpitäjät voivat poistaa sen.

Seuraavat vaiheet