Ett användbart mönster för säkerhet är att tillämpa behörigheter baserade på data inom en post istället för att separat tilldela behörigheter till posten. Detta kan baseras på antingen metadata, enskilda kolumner (Bigtable kloner) eller element (Aggregate NoSQL databaser) värden.
Ett bra exempel är ett kundnamn som nämns i ett dokument. Du kanske vill begränsa åtkomsten till alla dokument som nämner det -kund till endast de personer som har tillgång till denna kunds information. Du kan begränsa åtkomsten till dessa dokument genom att bearbeta data i dokumentet och tillämpa relevanta säkerhetsbehörigheter baserat på värdet av den data.
Inga NoSQL-databaser ger denna möjlighet direkt ur lådan. Det beror på att behörigheter måste tilldelas posten efter det att data sparats av programmet men innan det är tillgängligt för hämtning av andra program eller användare. Så måste denna tillståndsuppgift ske inom transaktionsgränsen.
Även mycket få NoSQL-databaser stöder ACID-kompatibla transaktioner (MarkLogic, FoundationDB och Neo4j, gör till exempel). Om en databas inte stöder överlåtelse av behörigheter baserat på data i ett dokument, men stöder ACID-transaktioner och pre-commit-utlösare, är det enkelt att lösa.
Det är generellt lätt att skriva en trigger som kontrollerar förekomsten av ett värde inom en post och att ändra behörigheter baserat på dess värde. Så länge en databas stöder det under commitprocessen, och inte efter commit, så vet du att dina data är säkrade genom att använda en enkel pre-commit trigger.
Som ett exempel stöder MarkLogic Server fullständigt serialiserbara ACID-transaktioner och pre-commit triggers. Följande är ett enkelt XML-dokument som jag vill stödja för attributbaserad åtkomstkontroll:
jbloggs ACME Lorem Ipsum Dolar Sit Amet …
MarkLogic Server-utlösare använder W3C XQuery-språket. Följande XQuery-exempel är en enkel utlösare som, när den installeras i MarkLogic, tilldelar läsnings- och skrivbehörigheter:
xquery-versionen "1. 0 ml"; importmodul namnrymd trgr = ' // marklogic. com / xdmp / triggers 'at' / MarkLogic / triggers. xqy '; deklarera variabel $ trgr: uri som xs: sträng extern; deklarera variabel $ trgr: trigger som nod () extern; om ("ACME" = fn: doc ($ trgr: uri) / MeetingReport / Customer) och sedan xdmp: document-set-permissions ($ trgr-uri, (xdmp: behörighet ("senioralesales", "uppdatering"), xdmp: tillstånd ("försäljning", "läs"))) annat ()
När utlösaren är installerad i filuppsättningarna.xqy i en MarkLogic Server Modules Database, kör följande kod i webbkodningsprogrammet för MarkLogic - Query Console för att aktivera avtryckaren. På en standard MarkLogic Server-installation kan du hitta frågekonsolen på webbadressen: // localhost: 8000 / qconsole.
Här är kod som visar hur man installerar avtryckaren med hjälp av Query Console:
xquery-versionen "1. 0-ml"; importmodul namespace trgr = " // marklogic. com / xdmp / triggers" vid "/ MarkLogic / triggers. xqy '; trgr: create-trigger ("setperms"), "Set Sales Doc Permissions", trgr: trigger-data-händelse (trgr: collection-scope ("meetingreports"), trgr: dokumentinnehåll -commit ()), trgr: trigger-modul (xdmp: databas ("Moduler"), "/ triggers /", "setperms. xqy"), fn: true (), xdmp: standardtillstånd (), fn: falskt ())