2015-06-23 15 views
8

Un'API REST è scritta in ExpressJs 4.x.x/NodeJS.Come funziona l'ACL in un'API REST?

Supponiamo un'interfaccia:

app.delete('/api/v1/users/:uid', function (req, res, next) { 
... 
} 

Quindi, con che gli utenti di interfaccia può essere eliminato.

Supponiamo che ci siano 2 clienti nel sistema e ogni cliente ha utenti. Un utente può avere il privilegio di eliminare altri utenti con un ruolo denominato CustomersAdmin. Ma questo Utente dovrebbe solo essere in grado di cancellare Utenti che sono Utenti dalla sua Società (Cliente).

Quindi, prendiamo ACL nella scena. Supponendo che nella nostra ACL possiamo definire ruoli, risorse e permessi. (Codice è adottato dal http://github.com/OptimalBits/node_acl#middlware.)

app.delete('/api/v1/users/:uid', acl.protect(), function (req, res, next) 
{ 
// ? Delete User with uid = uid or check 
// ? first if current user is in same company as user uid 
} 

Ci sono due cose da considerare. Uno sta proteggendo il percorso da persone senza permesso a HTTP/DELETE su quella rotta (/ api/v1/users /: uid) e l'altro è che una persona con ruolo CustomersAdmin non può essere autorizzata a cancellare utenti da un altro Cliente.

ACL dovrebbe fare entrambe le cose? O dovrebbe proteggere il percorso/api/v1/utenti?

Quindi, dovrei utilizzarlo come

acl.allow([ 
{ 
    roles:'CustomersAdmin', 
    allows:[ 
    {resources:['/api/v1/users', '/api/v1/users'] permissions:'delete'} 
} 
app.delete('/api/v1/users/:uid',acl.middleware(3), function(req,res,next) 
{ 
Make sure uid is a User from same Customer as request is from(req.session.userid) 
} 

Questo permetterebbe ogni utente con CustomersAdmin ruolo per eliminare qualsiasi utente che vuole. Oppure è preferibile definire ogni possibile rotta dell'utente come risorsa e definire più ruoli che possono interagire con essi?

acl.allow([ 
{ 
    roles:'CustomersAdminOne', 
    allows:[ 
    {resources:['/api/v1/users/1', '/api/v1/users/2'], permissions:'delete'}] 
}, 
{ 
    roles:'CustomersTwoAdmin', 
    allows:[ 
    {resources:['/api/v1/users/3','/api/v1/users/4'], permissions:'delete'} 
    ] 
} 
app.delete('/api/v1/users/:uid',acl.middleware(), function(req,res,next) 
{ 
no logic needed to be sure that request is from a user within the same customer 
} 
+0

Ciao c'è un tutorial su come implementare node_acl, ho provato a usare quello su nom ma il suo networking per me. Apprezzerò la tua risposta –

risposta

2

Il modo in cui ho risolto questo era creare un ruolo per utente. Io uso postale mangusta Salva gancio:

acl.addUserRole(user._id, ['user', user._id]); 

Poi in post salvare gancio per una risorsa faccio questo:

acl.allow(['admin', doc.user._id], '/album/' + doc._id, ['*']); 
acl.allow(['guest', 'user'], '/album/' + doc._id, ['get']); 

È quindi possibile utilizzare il metodo isAllowed per controllare se req.user ha i permessi giusti.