09 Oct Månadens experttips – XPages:sessionAsSigner
Server-side JavaScript in XPages körs normalt med aktuell användares rättigheter.
Det innebär att användaren måste ha rättigheter att utföra alla operationer som koden utför.
Förfarandet skiljer sig från vanliga “WebQueryOpen”- och “WebQuerySave”-agenter, där agenterna körs med signerarens (den som sparat agenten) rättigheter.
I fallet med agenterna tillät förfarandet att utvecklaren/administratören begränsade webb-användarens behörighet på servern och i databasen.
Skillnaden i beteende kan medföra en del problem för vana Domino-utvecklare och administratörer.
Men det finns såklart en lösning.
Det nya globala objektet i Domino 8.5.2 “sessionAsSigner” ger koden signerarens behörighet!
Det finns dock en fallgrop att se upp med.
När “sessionAsSigner” används kan inte aktuell databas hämtas genom metoden “getCurrentDatabase()”.
För att hämta aktuell databas måste istället metoden “getDatabase()” användas, även för den aktuella databasen.
Notera att dokumentationen felaktigt antyder att “getCurrentDatabase()” kan användas!
Koden nedan är ett exempel på hur aktuell databas kan hämtas när “sessionAsSigner” används.
Exemplet:
- använder sesions-variabeln för att hämta information om aktuell databas.
- hämtar aktuell databas.
- skapar ett nytt dokument.
- sätter ett fält.
- sparar dokumentet.
var thisDb = sessionAsSigner.getDatabase(session.getServerName(),session.getCurrentDatabase().getFilePath()); var doc = thisDb.createDocument(); doc.appendItemValue("myfield", "Test data"); doc.save();
Om den globala variabeln “session” hade använts skulle användaren varut tvungen att vara “Depositor” eller “Author” för att kunna köra koden.
Med “sessionAsSigner” behöver användaren bara ha “Reader”-behörighet i databasens ACL (Access Control List).
Om ni inte redan har uppgraderat till Domino 8.5.2, så är kanske detta tips ett bra argument.