Et nyttigt mønster for sikkerhed er at anvende tilladelser baseret på data i en post i stedet for separat at tildele tilladelser til posten. Dette kunne være baseret på enten metadata, individuelle kolonne (Bigtable kloner) eller element (Aggregate NoSQL databaser) værdier.
Et godt eksempel er et kundenavn, der nævnes i et dokument. Du kan muligvis begrænse adgangen til alle de dokumenter, der nævner det - kunden til kun de personer, der har adgang til denne kundes oplysninger. Du kan begrænse adgangen til disse dokumenter ved at behandle dataene i dokumentet og anvende de relevante sikkerhedsrettigheder baseret på værdien af disse data.
Ingen NoSQL databaser giver denne mulighed lige ud af boksen. Det skyldes, at tilladelser skal tildeles til posten, efter at dataene er gemt af programmet, men før det er tilgængeligt for hentning af andre programmer eller brugere. Så denne tilladelsesopgave skal ske inden for transaktionsgrænsen.
Også meget få NoSQL-databaser understøtter ACID-kompatible transaktioner (MarkLogic, FoundationDB og Neo4j, gør for eksempel). Hvis en database ikke understøtter tilladelse baseret på data i et dokument uden for boks, men understøtter ACID-transaktioner og forudindstillede udløsere, er det nemt at finde en løsning.
Det er generelt nemt at skrive en trigger, der kontrollerer tilstedeværelsen af en værdi inden for en post og for at ændre tilladelser baseret på dens værdi. Så længe en database understøtter at gøre det under commitprocessen, og ikke efter forpligten, så ved du, at dine data er sikret ved at bruge en simpel pre-commit trigger.
Som et eksempel understøtter MarkLogic Server fuldt serialiserbare ACID-transaktioner og pre-commit triggers. Følgende er et simpelt XML-dokument, som jeg vil støtte til attributbaseret adgangskontrol:
jbloggs ACME Lorem Ipsum Dolar Sit Amet …
MarkLogic Server udløsere bruger W3C XQuery sproget. Følgende XQuery-eksempel er en simpel trigger, der, når den er installeret i MarkLogic, tildeler læse- og skrivetilladelser:
xquery-version "1. 0-ml"; importmodul navneområde trgr = ' // marklogic. com / xdmp / udløser 'at' / MarkLogic / triggers. xqy '; erklære variabel $ trgr: uri som xs: streng ekstern; erklære variabel $ trgr: trigger som node () ekstern; hvis ("ACME" = fn: doc ($ trgr: uri) / MeetingReport / Customer) så xdmp: dokument-set-tilladelser ($ trgr-uri, (xdmp: tilladelse ("senioralesales", "opdatering"), xdmp: tilladelse ("salg", "læs"))) ellers ()
Når udløseren er installeret i filsætpermerne.xqy i en MarkLogic Server Modules Database, udfør følgende kode i webkodningsprogrammet til MarkLogic - Query Console for at aktivere udløseren. På en standard MarkLogic Server-installation kan du finde Query Console på webadressen: // localhost: 8000 / qconsole.
Her er en kode, der viser, hvordan du installerer triggeren ved hjælp af Query Console:
xquery version "1. 0-ml"; importmodul navneområde trgr = " // marklogic. com / xdmp / triggers" at '/ MarkLogic / triggers. xqy '; trgr: create-trigger ("setperms"), "Set Sales Doc Permissions", trgr: trigger-data-begivenhed (trgr: collection-scope ("meetingreports"), trgr: dokumentindhold -commit ()), trgr: trigger-modul (xdmp: database ("Moduler"), "/ triggers /", "setperms. xqy"), fn: true (), xdmp: standard-tilladelser (), fn: false ())