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äänrakennetut authenticated toiminnot ja anonymous roolit. 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
anonymous Sallii pääsyn ilman kelvollista käyttäjäistuntoa. Lisätietoja löytyy kohdasta Anonyymi tiedonkäyttö Fabric-sovelluksissa. Julkinen data ja todentautumattomat kokemukset

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', , 'read''update''delete', , 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