2015-08-09 12 views
10

Sto provando a creare un nuovo utente tramite l'API REST e voglio che l'oggetto sia accessibile (leggi + scrivi) solo all'utente che l'ha creato. Se creo l'utente senza impostare un ACL, impostando solo il nome utente/password, ottiene automaticamente "Lettura pubblica, xxxx" dove xxxx è objectId.Perché non posso impostare l'ACL per un utente da leggere: false + write: false?

Se includo un ACL con la chiamata utente di creazione, ignora automaticamente il campo e fornisce lo stesso accesso di lettura pubblico.

{"username":"dummyUsersname","ACL":{"*":{"write":false,"read":false}},"password":"dummyPassword"} 

Se provo ad aggiornare l'ACL dopo aver creato l'oggetto, ottengo:

code: 123 error: Invalid acl {"*":{"read":false,"write":false}} 

Eppure il browser di dati basata sul web mi permette di revocare l'accesso in lettura pubblica senza lamentarsi. Qualche idea su cosa sta succedendo?

risposta

4

Provare a utilizzare la funzione Codice Cloud:

Parse.Cloud.beforeSave(Parse.User, function(request, response) { 
    var acl = new Parse.ACL(); 
    acl.setPublicReadAccess(false); 
    acl.setPublicWriteAccess(false); 

    request.object.setACL(acl); 
    response.success(); 
}); 

Se lo si usa, richiesta

curl -X POST \ 
    -H "X-Parse-Application-Id: <app_id>" \ 
    -H "X-Parse-REST-API-Key: <rest_api_key>" \ 
    -H "X-Parse-Revocable-Session: 1" \ 
    -H "Content-Type: application/json" \ 
    -d '{"username":"cooldude6","password":"p_n7!-e8","phone":"415-392-0202"}' \ 
    https://api.parse.com/1/users 

... rendimenti:

{"ACL":{"adItsbPH0a":{"read":true,"write":true}},"createdAt":"2015-08-13T10:10:09.591Z","objectId":"adItsbPH0a","phone":"415-392-0202","sessionToken":"r:otH4qsd2zmBG4tTj4ePoGSFVE","username":"cooldude6"} 

Spero che questo aiuti.

+1

Piccolo nit: non si deve passare una stringa come nome della classe se si aggiungono trigger per classi predefinite, in questo esempio, utilizzare 'Parse.User' invece di' "_User" ' –

+0

@ BjörnKaiser grazie, riparato –

+0

Funziona come un incantesimo, grazie! – Aaron

0

In realtà, non è necessario creare l'ACL a livello di codice per ottenere il comportamento corretto per "solo chiave master" qui, è sufficiente specificare un oggetto vuoto ({}). Chiamare i metodi per impostare i parametri giusti funziona ma non risponde alla domanda sul perché questo è il caso.

La risposta, sebbene fastidiosa e incoerente, è che si CAN rappresentarlo esplicitamente in forma abbreviata fornendo semplicemente un oggetto vuoto per l'ACL o nessun oggetto. Dimostrazione:

var acl = new Parse.ACL(); 
acl.toJSON(); 

uscita: {}

acl.setPublicReadAccess(true); 
acl.toJSON(); 

uscita: { '*': { read: true } }

acl.setPublicReadAccess(false); 
acl.toJSON(); 

uscita: {}

Nota che cancellando l'accesso in lettura pubblica rimuove la chiave del tutto invece di leggere l'impostazione a falso

Ciò rende difficile creare ACL a livello di programmazione perché si potrebbe pensare che { '*': { read: false, write: false} } sia equivalente, ma non lo è.

Basta fornire ACL: {} e funzionerà perfettamente. Saluti.

Problemi correlati