Security & Privacy
Parse: Sichere ToDo-App mit Cloud-Code und ACLs
22 min
wie man eine sichere app mit parse erstellt einführung ahoy back4app community! dies ist ein gast tutorial von joren winge bei startup soul http //startup soul com/ wir helfen startups, ihre produkte schnell zu entwickeln und auf den markt zu bringen unsere freunde bei back4app haben uns gebeten, ihnen zu zeigen, wie man eine sichere app auf back4app aufbaut in diesem beitrag führen wir sie durch die schritte, um eine sichere to do app auf back4app zu erstellen sicherheit ist wichtig wenn ihre app überhaupt erfolgreich ist, müssen sie sicherstellen, dass die daten ihrer app sicher sind und dass ihr system nicht gehackt werden kann sicherheitsfunktionen auf parse lassen sie uns zunächst über die erste sicherheitsstufe sprechen, acls (zugriffssteuerungsliste) acls sind im grunde genommen nur regeln, die sie festlegen, wenn sie ein objekt erstellen angenommen, sie erstellen ein to do element, zum zeitpunkt der erstellung können sie festlegen, von wem das element gelesen werden kann und von wem es geschrieben werden kann sie können bestimmten benutzern das lesen oder schreiben dieses elements erlauben oder eines von beiden auf öffentlich setzen, was den zugriff für jeden ermöglicht aber acls funktionieren nicht immer es gibt fälle, in denen sie möglicherweise eine etwas ausgeklügeltere logik benötigen, anstatt eine einfache acl manchmal können sie sich auch in eine ecke drängen, in der sie jemandem den zugriff auf ein objekt unter bestimmten bedingungen anstelle einer absoluten basis wie bei acls gewähren müssen lassen sie uns also die verwendung von acls überspringen sie sind zu starr und erlauben gleichzeitig zu viel zugriff auf die daten ich werde ihnen jetzt das geheimnis verraten, um eine sichere app auf back4app und parse server zu erstellen bereit? klassenebene berechtigungen! ja, wir werden klassenebene berechtigungen für jede tabelle in unserer datenbank festlegen und das niveau der berechtigung, das wir festlegen werden, ist überhaupt keine berechtigung wir werden jede einzelne tabelle so sperren, dass niemand lese oder schreibzugriff hat! klingt extrem, ich weiß, aber das ist der erste schritt zur erstellung einer sicheren app die einzige berechtigung, die wir zulassen werden, ist auf der benutzertabelle, die für die erstellung neuer benutzerobjekte und für den benutzer zum anzeigen seiner eigenen daten erforderlich ist, um den aktuellen benutzer zu aktualisieren wir werden den benutzer daran hindern, die daten anderer benutzer einzusehen, indem wir acls verwenden dies ist das einzige mal, dass wir acls verwenden werden, also denke ich, dass sie nicht völlig nutzlos sind sie sind gut zu haben, aber verlasse dich nicht darauf, dass sie alles erledigen aber wie werden wir auf die daten zugreifen, fragst du? gute frage, schön, dass du darüber nachdenkst! nun, das geheimnis, um den clients den zugriff auf die daten auf kontrollierte weise zu ermöglichen, besteht darin, jede einzelne interaktion zwischen dem client und der datenbank durch eine cloud code funktion zu filtern ja, jedes mal, wenn du etwas mit deiner app machst, wird es jetzt über eine benutzerdefinierte cloud code funktion erfolgen keine clientbasierten pfqueries mehr du überspringst im grunde die gesamte clientbasierte parse sdk nutzung, außer für funktionen zur registrierung, anmeldungen, passwort vergessen funktionen und abmeldungen für diese werden wir weiterhin die nativen client sdks verwenden es ist einfach einfacher hast du jemals cloud code geschrieben? nein, sagst du? nun, es ist ziemlich einfach es ist nur javascript und es verwendet das parse javascript sdk, aber intern auf dem server deiner eigenen app tatsächlich, da der parse server auf node js basiert, ist es ziemlich ähnlich wie das schreiben von routen mit express, aber noch einfacher, da deine abfragesprache bereits installiert ist und cloud code funktionen viel einfacher zu schreiben sind als eine gesamte node js express app also, hier ist, was wir tun werden wir werden eine ios todo app verwenden, die ich bereits erstellt habe wir werden uns nicht damit aufhalten, dir zu zeigen, wie ich sie erstellt habe stattdessen werden wir uns darauf konzentrieren, cloud code zu schreiben und die datenbank abzusichern die todo app wird eine sichere app sein, in der du nur auf deine eigenen todos zugreifen und nur deine eigenen todos schreiben kannst die daten werden sicher auf dem server vor böswilligen, unberechenbaren clients geschützt sein ich werde dir auch zeigen, wie man einen sicheren parse hintergrundjob schreibt im grunde dasselbe wie ein cron job damit du automatisierte dienste haben kannst, die deine daten nach einem zeitplan manipulieren klingt kompliziert, ist es aber nicht stell dir einfach kleine server roboter vor, die tun, was du willst, nach einem automatisierten zeitplan klingt cool, oder? ok, also legen wir los!!!!!! lass uns die back4app secure todo app einrichten 1\) erstellen sie eine app auf back4app erstellen sie eine neue app auf back4app nennen sie die app ‚sichere todo app‘ hinweis folgen sie dem neuen parse app tutorial um zu lernen, wie man eine app bei back4app erstellt gehen sie zur seite der core einstellungen der app und klicken sie dann auf app details bearbeiten deaktivieren sie das kontrollkästchen mit der bezeichnung ‚erlauben sie die erstellung von client klassen‘, um die erstellung von client klassen zu deaktivieren, und klicken sie auf speichern wir möchten die möglichkeiten des clients als regel einschränken 2\) legen sie die sicherheitsberechtigungen auf klassenebene für die benutzerklasse fest als nächstes werden wir die berechtigungen für die benutzerklasse festlegen gehen sie zum back4app datenbank dashboard und klicken sie auf die benutzerklasse klicken sie dann auf die registerkarte sicherheit, und klicken sie auf das zahnradsymbol in der oberen rechten ecke sie sollten ein menü sehen, das einfach/erweitert sagt schalten sie den schalter auf erweitert sie sollten dann die vollständigen klassenberechtigungen für diese klasse sehen deaktivieren sie das kontrollkästchen finden deaktivieren sie das kontrollkästchen aktualisieren und löschen schließlich deaktivieren sie das kontrollkästchen feld hinzufügen klicken sie dann auf speichern ihre sicherheitseinstellungen sollten so aussehen 3\) erstellen sie die todo klasse klicken sie auf klasse erstellen und nennen sie sie todo setzen sie den klassentyp auf benutzerdefiniert 4\) legen sie die sicherheitsberechtigungen auf klassenebene für die todo klasse fest als nächstes werden wir die berechtigungen für die todo klasse festlegen gehen sie zum back4app datenbank dashboard und klicken sie auf die todo klasse klicken sie dann auf die registerkarte sicherheit, und klicken sie auf das zahnradsymbol in der oberen rechten ecke sie sollten ein menü sehen, das einfach/erweitert sagt schalten sie den schalter auf erweitert sie sollten dann die vollständigen klassenberechtigungen für diese klasse sehen deaktivieren sie alles und klicken sie auf speichern ihre sicherheitseinstellungen sollten so aussehen 5\) lassen sie uns einige spalten zur todo klasse hinzufügen zuerst verbinden wir die todo klasse mit der benutzerklasse wir werden dies tun, indem wir 2 spalten hinzufügen die erste spalte wird ‘user’ genannt und wird ein zeiger zurück zur benutzerklasse sein als nächstes erstellen wir eine spalte für die objekt id des benutzers, der es erstellt hat es wird vom typ string sein und ‘userobjectid’ genannt werden als nächstes erstellen wir eine spalte, um unsere tatsächlichen todo informationen zu speichern es wird ebenfalls ein string sein und ‘tododescription’ genannt werden lass uns ein boolean erstellen, um den status des todo zu halten nennen wir es ‘finished’ schließlich fügen wir eine weitere spalte hinzu, um das datum zu speichern, an dem du dein todo abgeschlossen hast nennen wir es ‘finisheddate’ und setzen wir es auf den datentyp deine todo klasse sollte so aussehen 6\) lass uns den client durchgehen der client ist eine ziemlich einfache todo app sie verwendet die integrierten parse funktionen, um sich anzumelden, einen neuen benutzer zu erstellen und dein passwort zurückzusetzen abgesehen davon basiert alles auf cloud code und ist sicher die acls des benutzers werden ebenfalls sofort festgelegt, sobald sie sich anmelden oder registrieren, nur um 100% sicherzustellen, dass das system sicher ist lass uns damit beginnen, die cloud code funktion zu schreiben, um die acl des benutzers beim anmelden oder registrieren festzulegen zu jeder zeit können sie auf das vollständige ios projekt zugreifen, das mit diesem tutorial erstellt wurde, unter diesem github repository sie können auch auf die main js cloud code datei zugreifen, die für dieses tutorial erstellt wurde, unter diesem github repository 1 gehen sie im client zu todocontroller swift und suchen sie nach der funktion setusersaclsnow diese funktion wird aufgerufen, wenn sie sich anmelden oder den loggedinviewcontroller swift anzeigen die funktion überprüft, ob sie angemeldet sind, und wenn ja, ruft sie die cloud funktion auf, um ihre persönlichen benutzer acls einzurichten todocontroller swift 1 func setusersaclsnow(){ 2 if pfuser current() != nil{ 3 let cloudparams \[anyhashable\ string] = \["test" "test"] 4 pfcloud callfunction(inbackground setusersacls, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 //print(error debugdescription) 8 if let descrip = error? localizeddescription{ 9 print(descrip) 10 } 11 }else{ 12 print(result as! string) 13 } 14 }) 15 } 16 } 2 jetzt lass uns die cloud code funktion schreiben parse server 3 x 1 parse cloud define('setusersacls', async(request) => { 2 let currentuser = request user; 3 currentuser setacl(new parse acl(currentuser)); 4 return await currentuser save(null, { usemasterkey true }); 5 }); parse server 2 x 1 parse cloud define('setusersacls', function (request, response) { 2 var currentuser = request user; 3 currentuser setacl(new parse acl(currentuser)); 4 currentuser save(null, { 5 usemasterkey true, 6 success function (object) { 7 response success("acls updated"); 8 }, 9 error function (object, error) { 10 response error("got an error " + error code + " " + error description); 11 } 12 }); 13 }); 3 dieser cloud code nutzt zwei wichtige funktionen, um ihre app sicher zu machen request user und masterkey request user ermöglicht den zugriff auf den benutzer, der den cloud code aufruf tätigt, und erlaubt es ihnen, den zugriff für diesen benutzer zu beschränken in diesem fall verwenden wir es, um die acls des benutzers festzulegen, um den lesezugriff nur auf den aktuellen benutzer zu beschränken auf diese weise kann nur der benutzer seine eigenen informationen lesen die berechtigungen auf klassenebene verhindern den schreibzugriff, selbst für den aktuellen benutzer auf diese weise können benutzer ihre eigenen informationen nicht ändern sie können nur dinge über ihren eigenen benutzer über cloud code ändern es ist möglich, falsche informationen zu importieren, wenn sich der benutzer zuerst anmeldet, aber ich würde empfehlen, eine cloud code funktion zu schreiben, um die informationen des benutzers zu überprüfen, nachdem ein neuer benutzer erstellt wurde die integrierte parse funktion zum erstellen eines neuen benutzers ist wirklich hilfreich, daher denke ich, dass es ein anständiger kompromiss ist, aber sie können immer die standardwerte für den benutzer über cloud code direkt nach der anmeldung festlegen es gibt viele sicherheitsvorkehrungen, die sie auch in den cloud code schreiben können, und sie automatisch und kontinuierlich mit hintergrundjobs ausführen, um böswillige benutzerinformationen zu erkennen, die beim ersten erstellen des benutzers importiert wurden wenn sie wirklich sicher sein wollen, können sie alle sensiblen informationen wie mitgliedschaftsstatus oder zahlungsinformationen in einer separaten tabelle von der benutzertabelle speichern auf diese weise kann der benutzer keine sensiblen informationen bei der erstellung des benutzers fälschen 4\ als nächstes schauen wir uns an, wie man eine todo erstellt gehen sie im client zu todocontroller swift und suchen sie nach der funktion savetodo diese funktion wird aufgerufen, wenn sie ein neues todo erstellen die funktion nimmt einen string, der das todo beschreibt, und speichert es in der datenbank todocontroller swift 1 func savetodo(todostring\ string, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["todostring"\ todostring] 4 pfcloud callfunction(inbackground createtodosforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 5\ jetzt schreiben wir die cloud code funktion, um das todo in der datenbank zu speichern parse server 3 x 1 parse cloud define("createtodosforuser", async(request) => { 2 let currentuser = request user; 3 let todostring = request params todostring; 4 let todo = parse object extend("todo"); 5 let todo = new todo(); 6 todo set("user", currentuser); 7 todo set("userobjectid", currentuser id); 8 todo set("tododescription", todostring); 9 todo set("finished", false); 10 return await todo save(null, { usemasterkey true }); 11 }); parse server 2 x 1 parse cloud define("createtodosforuser", function(request, response) { 2 var currentuser = request user; 3 var todostring = request params todostring; 4 var todo = parse object extend("todo"); 5 var todo = new todo(); 6 todo set("user", currentuser); 7 todo set("userobjectid", currentuser id); 8 todo set("tododescription", todostring); 9 todo set("finished", false); 10 todo save(null, { 11 usemasterkey true, 12 success function (object) { 13 response success(\[todo]); 14 }, 15 error function (object, error) { 16 response error("got an error " + error code + " " + error description); 17 } 18 }); 19 }); 6 diese cloud code funktion erstellt ein todo objekt und setzt den aktuellen benutzer als eigentümer des objekts dies ist wichtig, damit nur der benutzer, der es erstellt hat, es finden oder ändern kann indem wir nicht zulassen, dass todos im client erstellt werden, zwingen wir das todo objekt, unseren standards zu entsprechen und stellen sicher, dass die todos dem benutzer gehören, der sie erstellt hat 7\ als nächstes schauen wir uns an, wie man die todos, die sie vom server erstellt haben, abruft gehen sie im client zu todocontroller swift und suchen sie nach der funktion gettodosfordate diese funktion wird aufgerufen, wenn sie ihre todos abrufen die funktion nimmt ein datum als parameter und verwendet es, um eine liste von todos abzurufen, die sie vor diesem datum in absteigender reihenfolge erstellt haben die verwendung eines datums ist eine großartige möglichkeit, eine lazy loading abfrage zu schreiben, die keine skips verwendet skip kann manchmal bei großen datensätzen fehlschlagen todocontroller swift 1 func savetodo(todostring\ string, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["date"\ date] 4 pfcloud callfunction(inbackground gettodosforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 8\ jetzt schreiben wir die cloud code funktion, um todos aus der datenbank basierend auf einem startdatum abzurufen wir fragen nach todos, die vor dem parameterdatum erstellt wurden, also verwenden wir 'query lessthan', da daten im grunde genommen zahlen sind, die größer werden, je weiter in der zukunft man sich befindet ich habe hier auch etwas kniffligen code eingefügt angenommen, wir schließen das benutzerobjekt ein, das das todo erstellt hat, aber wir möchten keine sensiblen informationen über diesen benutzer mit anderen benutzern teilen, müssen wir es aus der json antwort entfernen also haben wir eine for schleife, in der wir das benutzerobjekt aus dem todo herausnehmen, die e mail und den benutzernamen aus der json entfernen und dann wieder ins todo einfügen dies ist praktisch, um sensible daten aus einem api aufruf in situationen zu entfernen, in denen sie nicht kontrollieren können, welche felder sie zurückgeben wie z b ein eingeschlossenes benutzerobjekt in diesem fall benötigen wir es nicht wirklich, da diese funktion nur todos zurückgibt, die sie selbst erstellt haben wir tun dies, indem wir currentuser erneut verwenden, um nur todos abzufragen, die vom currentuser erstellt wurden, der an die anfrage angehängt war die ergebnisse werden in absteigender reihenfolge zurückgegeben, sodass die neuesten todos zuerst erscheinen wenn sie eine weitere charge von todos lazy laden müssen, nehmen sie das createdat datum des letzten todos und verwenden es als datumsparameter für die nächste anfrage parse server 3 x 1 parse cloud define("gettodosforuser", async(request) => { 2 let currentuser = request user; 3 let date = request params date; 4 let query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query lessthan("createdat", date); 7 query descending("createdat"); 8 query limit(100); 9 query include("user"); 10 let results = await query find({ usemasterkey true }); 11 if(results length === 0) throw new error('no results found!'); 12 13 let resultsarray = \[]; 14 for (let i = 0; i < results length; i++) { 15 let todo = results\[i]; 16 let tempuser = todo get("user"); 17 let jsonuser = tempuser tojson(); 18 delete jsonuser email; 19 delete jsonuser username; 20 21 jsonuser type = "object"; 22 jsonuser classname = " user"; 23 24 let cleanedtodo = todo tojson(); 25 cleanedtodo user = jsonuser; 26 cleanedtodo type = "object"; 27 cleanedtodo classname = "todo"; 28 resultsarray push(cleanedtodo); 29 } 30 return resultsarray; 31 }); parse server 2 x 1 parse cloud define("gettodosforuser", function(request, response) { 2 var currentuser = request user; 3 var date = request params date; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query lessthan("createdat", date); 7 query descending("createdat"); 8 query limit(100); 9 query include("user"); 10 query find({ 11 usemasterkey true, 12 success function (results) { 13 var resultsarray = \[]; 14 for (var i = 0; i < results length; i++) { 15 var todo = results\[i]; 16 var tempuser = todo get("user"); 17 var jsonuser = tempuser tojson(); 18 delete jsonuser email; 19 delete jsonuser username; 20 21 jsonuser type = "object"; 22 jsonuser classname = " user"; 23 24 var cleanedtodo = todo tojson(); 25 cleanedtodo user = jsonuser; 26 cleanedtodo type = "object"; 27 cleanedtodo classname = "todo"; 28 resultsarray push(cleanedtodo); 29 } 30 response success(resultsarray); 31 }, 32 error function (error) { 33 response error(" error " + error code + " " + error message); 34 } 35 }); 36 }); 9 jetzt, da wir die todos haben, können wir sie in der app sehen und sie als abgeschlossen markieren, wenn wir möchten lassen sie uns das als nächstes behandeln 10\ um eine aufgabe als abgeschlossen zu markieren, drücken sie einfach die schaltfläche ‚als abgeschlossen markieren‘ bei einer der aufgaben, die sie erstellt haben dies löst eine methode im todocontroller swift namens ‚marktodosascompletedfor‘ aus, die die von ihnen ausgewählte aufgabe als parameter verwendet sie sendet die todo objectid als parameter an den server und gibt dann die aktualisierte aufgabe als ergebnis zurück todocontroller swift 1 func marktodosascompletedfor(todo\ todo, completion @escaping ( result bool, message\ string, todoarray \[todo]) >()){ 2 var resulttodoarray \[todo] = \[] 3 let cloudparams \[anyhashable\ any] = \["todoid"\ todo objectid ?? ""] 4 pfcloud callfunction(inbackground marktodoascompletedforuser, withparameters cloudparams, block { 5 (result any?, error error?) > void in 6 if error != nil { 7 if let descrip = error? localizeddescription{ 8 completion(false, descrip, resulttodoarray) 9 } 10 }else{ 11 resulttodoarray = result as! \[todo] 12 completion(true, "success", resulttodoarray) 13 } 14 }) 15 } 11\ jetzt werden wir den cloud code schreiben, um dieses todo zu aktualisieren es sucht nach dem todo, das aktualisiert werden soll, basierend auf der objectid, verwendet aber auch den currentuser, um sicherzustellen, dass das todo, das mit der objectid verknüpft ist, von dem benutzer erstellt wurde, der die abfrage durchführt dies stellt sicher, dass sie nur todos anzeigen können, die sie erstellt haben, und ist somit sicher wir fügen ein limit von 1 ergebnis hinzu, um sicherzustellen, dass der server nicht weiter sucht, nachdem das todo gefunden wurde es gibt eine andere methode, um ein objekt basierend auf einer objectid zu finden, aber ich benutze sie nicht gerne, da sie seltsame ergebnisse zurückgeben kann, wenn sie das mit der objectid verknüpfte objekt nicht findet wir setzen auch das 'finisheddate' mit dem aktuellen datum, wenn das objekt aktualisiert wurde indem wir das finisheddate nur durch diese funktion festlegen, haben wir sichergestellt, dass das finisheddate sicher ist und nicht gefälscht oder geändert werden kann wir haben auch 'query equalto("finished", false)' verwendet, um sicherzustellen, dass nur ein unfertiges todo als fertig markiert werden kann und das finisheddate gesetzt wird das bedeutet, dass ein todo, das als fertig markiert wurde, niemals zu einem späteren zeitpunkt erneut als fertig markiert werden kann parse server 3 x 1 parse cloud define("marktodoascompletedforuser", async(request) => { 2 let currentuser = request user; 3 let todoid = request params todoid; 4 let query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 let todo = await query first({ usemasterkey true }); 9 if(object keys(todo) length === 0) throw new error('no results found!'); 10 todo set("finished", true); 11 let date = new date(); 12 todo set("finisheddate", date); 13 try { 14 await todo save(null, { usemasterkey true}); 15 return todo; 16 } catch (error){ 17 return("getnewstore error " + error code + " " + error message); 18 } 19 }); parse server 2 x 1 parse cloud define("marktodoascompletedforuser", function(request, response) { 2 var currentuser = request user; 3 var todoid = request params todoid; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 query limit(1); 9 query find({ 10 usemasterkey true, 11 success function (results) { 12 if (results length > 0) { 13 var todo = results\[0]; 14 todo set("finished", true); 15 var date = new date(); 16 todo set("finisheddate", date); 17 todo save(null, { 18 usemasterkey true, 19 success function (object) { 20 response success(\[todo]); 21 }, 22 error function (object, error) { 23 response error("got an error " + error code + " " + error description); 24 } 25 }); 26 } else { 27 response error("todo not found to update"); 28 } 29 30 }, 31 error function (error) { 32 response error(" error " + error code + " " + error message); 33 } 34 }); 35 }); 7\) zusammenfassung! und das ist es sie haben eine sichere todo app erstellt nochmals, der schlüssel zur erstellung einer sicheren app auf dem parse server besteht darin, alle klassenberechtigungen für alle klassen außer der benutzerklasse zu deaktivieren in der benutzerklasse deaktivieren sie alle berechtigungen außer create und get stellen sie auch sicher, dass sie alle acls des benutzers so festlegen, dass der benutzer nur seine eigenen daten abrufen kann dann laufen alle ihre interaktionen über cloud code und werden mit request user, auch bekannt als currentuser, gefiltert also, da haben sie es, sie können jetzt sichere systeme auf dem parse server und back4app aufbauen aber warten sie, sagen sie? was ist mit hintergrundjobs und live abfragen? nun, sie haben einen guten punkt, also werde ich das in zwei bonusabschnitten als nächstes behandeln 8\) bonusabschnitte 1\ hintergrundjobs manchmal müssen sie einen hintergrundjob erstellen, der jede stunde, jeden tag oder jede woche ausgeführt wird wenn sie alle klassenberechtigungen deaktiviert haben, kann ihr hintergrundjob die datenbank nicht abfragen, es sei denn, er ist korrekt eingerichtet das ist ein bisschen knifflig, also möchte ich hier ein beispiel dafür einfügen in diesem fall werden wir einen hintergrundjob erstellen, der die datenbank nach unvollendeten todos durchsucht, die älter als 1 jahr sind, und sie dann automatisch als abgeschlossen markiert der trick dabei ist, ‘usemasterkey’ korrekt zu verwenden es muss der abfrage vor dem then promises hinzugefügt werden folgen sie einfach dieser vorlage, und sie sollten in der lage sein, sichere hintergrundjobs einfach zu schreiben sie beginnen immer mit dem schreiben einer abfrage, die sie über die gesamte datenbank iterieren möchten, und stellen dann sicher, dass sie status error einfügen, wenn ein fehler auftritt, und es mit status success beenden, um sicherzustellen, dass es abgeschlossen wird sie können die protokolle auf back4app beobachten, um zu sehen, wie der hintergrundjob funktioniert, während sie ihn ausführen parse server 3 x 1 parse cloud job("markunfinishedtodosolderthan1yearasfinished", async(request) => { 2 let date = new date(); 3 let intyear = date getfullyear() 1; 4 let query = new parse query("todo"); 5 query equalto("finished", intyear); 6 query lessthan("createdat", date); 7 8 let todo = await query find({ usemasterkey true }); 9 for (let i = 0; i < results length; i++) { 10 let todo = results\[i]; 11 todo set("finished", true); 12 todo set("finisheddate", date); 13 try { 14 await todo save(null, { usemasterkey true}); 15 } catch (error){ 16 console log("getnewstore error " + error code + " " + error message); 17 } 18 } 19 return "migration completed successfully "; 20 }); parse server 2 x 1 parse cloud define("marktodoascompletedforuser", function(request, response) { 2 var currentuser = request user; 3 var todoid = request params todoid; 4 var query = new parse query("todo"); 5 query equalto("user", currentuser); 6 query equalto("objectid", todoid); 7 query equalto("finished", false); 8 query limit(1); 9 query find({ 10 usemasterkey true, 11 success function (results) { 12 if (results length > 0) { 13 var todo = results\[0]; 14 todo set("finished", true); 15 var date = new date(); 16 todo set("finisheddate", date); 17 todo save(null, { 18 usemasterkey true, 19 success function (object) { 20 response success(\[todo]); 21 }, 22 error function (object, error) { 23 response error("got an error " + error code + " " + error description); 24 } 25 }); 26 } else { 27 response error("todo not found to update"); 28 } 29 30 }, 31 error function (error) { 32 response error(" error " + error code + " " + error message); 33 } 34 }); 35 }); 2\ live abfragen manchmal müssen sie die live abfragefunktion von parse für etwas wie eine live chat app verwenden sie möchten die live abfrage verwenden, um zu sehen, wann neue nachrichten für ihren benutzer erstellt werden die live abfrage ist im grunde genommen nur die art und weise, wie parse sockets verwendet, um live updates zu erhalten es ist ziemlich praktisch, funktioniert jedoch nicht mit einer klasse, deren find berechtigungen deaktiviert wurden in diesem fall werden wir die find berechtigungen für die nachrichtenklasse wieder aktivieren und stattdessen die acls für diese nachricht direkt zuweisen die acl sollte so eingestellt sein, dass nur der empfänger eine find abfrage verwenden kann, um die nachricht vom server abzurufen dann führen sie ihre pf live abfrage in ihrem client aus, um nach nachrichten für ihren benutzer zu suchen, und es wird einwandfrei funktionieren wenn sie es mit gruppen nachrichten zu tun haben, ist es etwas anders sie können mehreren personen die acl zuweisen, aber es skaliert wirklich nicht stattdessen gibt es einen besseren weg sie setzen die acl basierend auf einer rolle parse role und dann weisen sie jedem benutzer, der zugriff auf diese nachricht haben soll, einfach diese parse role zu wenn sie verhindern möchten, dass sie die nachrichten für diese gruppe lesen, entfernen sie sie aus dieser rolle das ist viel einfacher, als sie aus der acl jeder einzelnen nachricht zu entfernen, und es skaliert für sehr große gruppen das ist der richtige weg, es zu tun ich werde kein codebeispiel dafür hinterlassen, da es für dieses tutorial zu komplex ist, aber vielleicht erkläre ich, wie man es in meinem nächsten tut vielen dank, dass sie dieses tutorial zur sicherheit mit parse und back4app gelesen haben wenn sie fragen haben, zögern sie nicht, kontaktieren sie mich und ich beantworte sie gerne danke! joren