Badam to samo pytanie i natknąłem się na kilka dobrych modułów. Skupiłem się na pakiecie acl-node, który można znaleźć tutaj. https://github.com/optimalbits/node_acl.
Ten pakiet wydaje się implementować wzór ACL w bardzo zrozumiały sposób i zapewnił sposoby łatwej integracji z aplikacją węzła/ekspresu.
Po pierwsze, będziesz chciał zdefiniować swoje zasoby, role i uprawnienia.
Na przykład, zasoby mogą być:
/
/forums
/forums/threads
Role mogą być
public
admin
user
john
jane
W tym przykładzie role John i Jane może mapować do rzeczywistych kont użytkowników, ale będą dziedziczyć wszystkie uprawnienia do roli użytkownika.
Uprawnienia dotyczące zasobów
- tworzą
- pokazać
- aktualizacja
- zniszczyć
lub swoich standardowych operacji CRUD.
Teraz, gdy zostały one zdefiniowane, możemy przyjrzeć się, jak byłoby wyglądać, aby ustawić acl za pomocą node-acl. Uwagi te pochodzą z dokumentacji
importu pakiet
var acl = require('acl');
Skonfiguruj backend. Moja aplikacja jest przy użyciu MongoDB, ale pakiet węzłów acl nie obsługuje inne mechanizmy przechowywania
acl = new acl(new acl.mongodbBackend(dbInstance, prefix));
moja aplikacja korzysta mongoose tak dbInstance zostanie zastąpiony mongoose.connection.db
Teraz dodajemy nasze role ACL. W node-acl role są tworzone przez nadanie im uprawnień. Jej jak zabijając dwie pieczenie na jednym ogniu (bez ptaki rzeczywiście szkodzi)
acl.allow('admin', ['/', '/forum', '/forum/threads'], '*');
acl.allow('public', ['/', '/forum', '/forum/threads'], 'show');
acl.allow('user', ['/', '/forum', '/forum/threads'], ['create', 'show']);
Załóżmy nowy zasób jest tworzony przez Jana, dodamy nowy rekord, który pozwala John również aktualizować i usuwać tego zasobu.
acl.allow('john', ['/forum/threads/abc123'], ['update', 'delete']);
Moja aplikacja również używa wyrażenia, więc użyję metody routingu pośredniego do sprawdzenia tras.W mojej konfiguracji routingu, chciałbym dodać linię
w większości ekspresowych konfiguracjach, to wygląda na poz
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) {...});
Kiedy żadne parametry są przekazywane, to sprawdzić, czy rola jest określona w req.userId zezwolono na wykonanie metody http na zidentyfikowanym zasobie, ale na trasie.
W tym przykładzie metoda http jest poczta, ale będzie to zrobić to samo dla każdego http idenitified w danej konfiguracji.
Nasuwa się pytanie o uprawnieniach określonych wcześniej. Aby odpowiedzieć na te pytania, trzeba by zmienić uprawnienia od
- tworzyć
- pokazać
- aktualizacja
- zniszczyć
do konwencjonalnego
- postu
- dostać
- umieścić
- usuwać
Chociaż ten przykład pokazuje wszystko na sztywno, lepszym rozwiązaniem jest mieć interfejs zarządzania dla swoich uprawnień, aby mogły być tworzone, czytać, zaktualizowane i usunięte dynamicznie, bez konieczności zmienić swój kod.
Lubię Węzeł-ACL wtyczek podejście, gdyż pozwala na bardzo drobnoziarnistych zadań pozwolenie-role stosując bardzo proste i elastyczne API. W ich dokumentacji jest dużo więcej, moje przykładowe pokazy były w pakiecie.
Mam nadzieję, że to pomaga.
Niestety, jak już wspomniano, że nie działa z Express-zasobów. – Patrick