2017-08-31 3 views
0

Gibt es eine Möglichkeit, ACL in Parse Server zu verwenden, um den Zugriff auf Elemente für einen bestimmten Benutzer oder eine Rolle zu verweigern?Zugriff für Benutzer/Rolle mit ACL verweigern

Angenommen, ich habe eine Social-Networking-App, in der Benutzer Updates posten. Ich habe eine Rolle namens all_users, der alle registrierten Benutzer hinzugefügt werden. Alle Updates sind für diese Rolle lesbar, MIT AUSNAHME von Benutzern, die der Autor blockiert hat.

Ich kann Lese- und Schreibzugriff für Benutzer/Rollen gewähren, aber das Entfernen von Lese- und Schreibzugriff über das Parse Dashboard entfernt den Eintrag vollständig.

Tipps würden sehr geschätzt werden.

Antwort

1

Ich war nicht 100% sicher, die Antwort, also tat ich, was ich normalerweise tue, machen einen Unit-Test, um es herauszufinden.

Währenddessen arbeite ich an einer PR, um eine "All-User-Rolle" zu erstellen, die Ihre aktuelle Lösung verbessert, besonders wenn Ihr soziales Netzwerk startet und Sie viele Benutzer haben.

Siehe Ausgabe: https://github.com/parse-community/parse-server/issues/4107

Sie können den aktuellen Stand meiner Lösung verfolgen (die zur Zeit arbeitet, ist aber nicht bereit, nur noch zu fusionieren) hier: https://github.com/parse-community/parse-server/pull/4111

Aber ich arbeite on ist der Fall 'all user role', nicht der Fall 'lease a user', den Sie benötigen.

Was ich tat, um Ihre Frage zu testen, war die Einheit Test von meiner pr erweitern auf Ihre (interessant) Adresse verwenden Fall:

it('should respect for read.', function (done) { 
    let role, user; 

    const userP = new Parse.User() 
    .set('username', 'userA') 
    .set('password', 'password') 
    .save() 
    .then((user) => Parse.User.logIn(user.get('username'), 'password')); 

    const roleP = new Parse.Role('aRole', new Parse.ACL()) 
    .save(); 

    Parse.Promise.when(userP, roleP) 
    .then((newUser, newrole) => { 
     user = newUser; 
     role = newrole; 
     const acl = new Parse.ACL(); 
     acl.setRoleReadAccess(role, true); 
     return new Parse.Object('Foo') 
     .setACL(acl) 
     .save(); 
    }) 
    .then(() => new Parse.Query('Foo').first()) 
    .then((obj) => { 
     expect(obj).not.toBeDefined(); 
     return new Parse.Query(Parse.Role) 
     .equalTo('name', '_All_Role') 
     .first() 
    }) 
    .then((allRole) => { 
     expect(allRole).toBeDefined(); 

     const roles = role.relation('roles'); 
     roles.add(allRole); 
     return role.save(null, { useMasterKey: true }); 
    }) 
    .then(() => new Parse.Query('Foo').first()) 
    .then((obj) => { 
     expect(obj).toBeDefined(); 
     const acl = obj.getACL(); 
     acl.setReadAccess(user.id, false); // <--- this is what you want!!! 
     console.log(acl); 
     const valid = obj.setACL(acl); 
     expect(valid).toBe(true); 
     return obj.save(); 
    }) 
    .then(() => new Parse.Query('Foo').first()) 
    .then((obj) => { 
     expect(obj).not.toBeDefined(); // <--- but this fails :(.... 
     done(); 
    }) 
    .catch(done.fail); 
}); 

Wie ich vermutete, versagt der Test. Ich bin kein Experte für Parse-Berechtigung (obwohl ich lerne), aber mein derzeitiges Verständnis ist, dass es kein Konzept der Präzedenz gibt, also gibt es keine Möglichkeit zu leugnen, sobald du die Erlaubnis durch deine Gruppe hinzugefügt hast. Mit anderen Worten, das aktuelle Berechtigungsmodell besteht darin, dass Berechtigungen hinzugefügt, jedoch nicht explizit abgelehnt werden.

Ihr Anwendungsfall ist überzeugend, aber es wäre interessant, einen Weg zu finden, Ihren Anwendungsfall anzupassen. Wie es oft der Fall ist, müssen Sie entweder herausfinden, wie Sie es hinzufügen, so dass es auch für die allgemeinen Anwendungsfälle akzeptabel ist, oder jemanden rekrutieren, der es kann (nicht freiwillig, meine Tanzkarte ist voll :).

Verwandte Themen