Я изучал тот же вопрос и наткнулся на несколько хороших модулей. Я сосредоточился на пакете node-acl, который можно найти здесь. https://github.com/optimalbits/node_acl.
Этот пакет, по-видимому, реализовал шаблон ACL очень понятным способом и предоставил способы легкой интеграции его в ваше приложение node / express.
Во-первых, вы захотите определить свои ресурсы, роли и разрешения.
Например, ресурсы могут быть:
/
/forums
/forums/threads
Роли могут быть
public
admin
user
john
jane
В этом примере роли john и jane могут сопоставляться с реальными учетными записями пользователей, но они наследуют все разрешения роли пользователя.
Разрешения на ресурсы
- создать
- шоу
- обновление
- уничтожить
Или ваши стандартные операции CRUD.
Теперь, когда они определены, мы можем взглянуть на то, как это будет выглядеть при настройке acl, используя node-acl. Эти заметки взяты из документации
импортировать пакет
var acl = require('acl');
Настройте свой бэкэнд. Мое приложение использует mongodb, но пакет node-acl поддерживает другие механизмы хранения
acl = new acl(new acl.mongodbBackend(dbInstance, prefix));
Мое приложение использует mongoose, поэтому dbInstance будет заменено на mongoose.connection.db
Теперь давайте добавим наши роли в ACL. В node-acl роли создаются путем предоставления им разрешений. Это все равно что убить двух зайцев одним выстрелом (на самом деле ни один из них не пострадал)
acl.allow('admin', ['/', '/forum', '/forum/threads'], '*');
acl.allow('public', ['/', '/forum', '/forum/threads'], 'show');
acl.allow('user', ['/', '/forum', '/forum/threads'], ['create', 'show']);
Предположим, что Джон создал новый ресурс, мы добавим новую запись, которая позволит Джону также обновлять и удалять этот ресурс.
acl.allow('john', ['/forum/threads/abc123'], ['update', 'delete']);
Мое приложение также использует экспресс, поэтому я буду использовать промежуточное программное обеспечение маршрутизации для проверки маршрутов. В моей конфигурации маршрутизации я бы добавил строку
В большинстве экспресс-конфигураций это похоже на 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) {...});
Если параметры не передаются, будет проверяться, разрешено ли роли, определенной в req.userId, выполнять метод http на указанном ресурсе, но на маршруте.
В этом примере метод http является post, но он будет делать то же самое для каждого http, идентифицированного в вашей конфигурации.
Это поднимает вопрос о разрешениях, определенных ранее. Чтобы ответить на эти вопросы, нам нужно изменить разрешения с
- создать
- шоу
- обновление
- уничтожить
К обычному
- сообщение
- получить
- 1074 * ставить *
- удалить
Хотя в этом примере показано все жестко закодированное, лучше иметь интерфейс управления для ваших разрешений, чтобы их можно было динамически создавать, считывать, обновлять и удалять без необходимости изменения кода.
Мне нравится подход плагинов node-acl, так как он позволяет выполнять очень тонкие назначения ролей разрешений с использованием очень простого и гибкого API. В их документации гораздо больше, мой пример показывает, что я с пакетом.
Надеюсь, это поможет.