Ho svolto ricerche sulla stessa domanda e ho riscontrato alcuni buoni moduli. Mi sono concentrato sul pacchetto node-acl che può essere trovato qui. https://github.com/optimalbits/node_acl.
Questo pacchetto sembra aver implementato il pattern ACL in un modo molto comprensibile e ha fornito modi per integrarlo facilmente nell'applicazione nodo/Express.
In primo luogo, è necessario definire le risorse, i ruoli e le autorizzazioni.
Per esempio, le risorse possono essere:
/
/forums
/forums/threads
I ruoli possono essere
public
admin
user
john
jane
In questo esempio, i ruoli John e Jane può mappare agli account utente reali, ma perché erediteranno tutte le autorizzazioni del ruolo utente.
Le autorizzazioni per le risorse
- creano
- mostrano
- aggiornamento
- distruggere
O le operazioni CRUD standard.
Ora che quelli sono stati definiti, possiamo dare un'occhiata a come sembrerebbe impostare l'acl usando node-acl. Queste note sono derivati dalla documentazione
importazione pacchetto
var acl = require('acl');
Impostare il backend. La mia applicazione sta usando MongoDB, ma il pacchetto di nodo-ACL non supporta altri meccanismi di stoccaggio
acl = new acl(new acl.mongodbBackend(dbInstance, prefix));
mia applicazione sta usando in modo mangusta dbInstance sarebbe sostituito con mongoose.connection.db
Ora lascia aggiungere i nostri ruoli da l'ACL. In node-acl, i ruoli vengono creati concedendo loro le autorizzazioni. E 'come prendere due piccioni con una fava (no uccelli sono in realtà danneggiati)
acl.allow('admin', ['/', '/forum', '/forum/threads'], '*');
acl.allow('public', ['/', '/forum', '/forum/threads'], 'show');
acl.allow('user', ['/', '/forum', '/forum/threads'], ['create', 'show']);
Consente assumere una nuova risorsa è stato creato da John, aggiungeremo un nuovo record che permette a John di aggiornare e cancellare anche quella risorsa.
acl.allow('john', ['/forum/threads/abc123'], ['update', 'delete']);
Anche la mia applicazione utilizza express, quindi userò l'approccio del routing middleware per controllare i percorsi.Nella mia configurazione di routing, vorrei aggiungere la linea
Nella maggior parte delle configurazioni Express, questo appare come per i pos
app.post('/', acl.middleware(), function(req, res, next) {...});
app.post('/forums', acl.middleware(), function(req, res, next) {...});
app.post('/forums/:forumId', acl.middleware(), function(req, res, next) {...});
app.post('/forums/threads', acl.middleware(), function(req, res, next) {...});
app.post('/forums/threads/:threadId', acl.middleware(), function(req, res, next) {...});
Quando sono passate alcun parametro, questo controlla se il ruolo definito nella req.userId è permesso di eseguire il metodo http sulla risorsa identificata ma sulla rotta.
In questo esempio il metodo http è post, ma farà la stessa cosa per ogni http identificato nella configurazione.
Ciò solleva la domanda, in merito alle autorizzazioni definite in precedenza. Per rispondere a queste domande, avremmo dovuto cambiare i permessi da
- creare
- mostrano
- aggiornamento
- distruggere
al tradizionale
- posta
- ottenere
- messo
- eliminare
Sebbene questo esempio mostra tutto hardcoded, la pratica migliore è quella di avere un'interfaccia di gestione per le autorizzazioni in modo che possano essere creati, leggere, aggiornati ed eliminati in modo dinamico, senza dover per modificare il codice.
Mi piace l'approccio plug-in di nodo-acl in quanto consente assegnazioni di ruoli di autorizzazione a grana molto fine utilizzando un api molto semplice e flessibile. C'è molto di più nella loro documentazione, il mio esempio mostra che io sono con il pacchetto.
Speriamo che questo aiuti.
Sfortunatamente, come già detto, non funziona con le risorse espresse. – Patrick