2012-03-07 15 views
69

Abbiamo un'applicazione con due tipi di utenti. A seconda di come l'utente si collega, vogliamo che abbiano accesso a diverse parti dell'applicazione.Node.js + Express.js Autorizzazione utente Modello di sicurezza

Come implementare un modello di sicurezza per impedire agli utenti di visualizzare le cose a cui non hanno accesso?

Facciamo parte della sicurezza di ogni implementazione di rotte? Il problema è che avremo qualche logica duplicata tra le richieste. Potremmo trasferirlo in funzioni di aiuto, ma dovremmo comunque ricordarci di chiamarlo.

Facciamo parte della sicurezza di un gestore di percorsi globale app.all()? Il problema è che dobbiamo ispezionare ogni rotta e fare una logica diversa basata su una moltitudine di regole. Almeno tutto il codice è in un posto, ma poi ... tutto il codice è in un posto.

risposta

120

Avere per rotta di solito funziona per me. Questo è quello che faccio di solito:

function requireRole (role) { 
    return function (req, res, next) { 
     if (req.session.user && req.session.user.role === role) { 
      next(); 
     } else { 
      res.send(403); 
     } 
    } 
} 

app.get("/foo", foo.index); 
app.get("/foo/:id", requireRole("user"), foo.show); 
app.post("/foo", requireRole("admin"), foo.create); 

// All bars are protected 
app.all("/foo/bar", requireRole("admin")); 

// All paths starting with "/foo/bar/" are protected 
app.all("/foo/bar/*", requireRole("user")); 
+0

Ma cosa succede se solo 2 ruoli possono accedere al percorso? –

+1

Potresti fare in modo che requireRole esegua un array? E controlla con 'indexOf'. –

+0

Potresti aggiungere un esempio? Quest'ultima rotta protegge tutti i percorsi che iniziano con/foo/bar? –

6

Date un'occhiata al this list per NodeJS ACL/sistemi di autorizzazione. IMHO OptimalBits node_acl sembra migliore.

+1

Esiste un elenco più recente di moduli ACL Node.js? Stiamo valutando come implementare ACL in un'app Meteor.js. –

2

Per questo è ora disponibile il modulo Node permission. È molto facile da usare, molto simile alla risposta accettata, ma vengono comunque aggiunte alcune funzionalità.

Problemi correlati