Node.js + Express.js Модель безопасности прав пользователя
У нас есть приложение с двумя типами пользователей. В зависимости от того, как пользователь входит в систему, мы хотим, чтобы у них был доступ к различным частям приложения.
Как мы реализуем модель безопасности, чтобы пользователи не могли видеть, к чему у них нет доступа?
Предоставляем ли мы часть безопасности каждой реализации маршрутов? Проблема состоит в том, что у нас будет какая-то повторяющаяся логика в запросах. Мы могли бы переместить это в вспомогательные функции, но нам все равно нужно было бы его назвать.
Мы делаем защитную часть глобального обработчика маршрута app.all()? Проблема состоит в том, что мы должны проверять каждый маршрут и выполнять разные логики, основываясь на множестве правил. По крайней мере, весь код находится в одном месте, но затем... весь код находится в одном месте.
Ответы
Ответ 1
Как правило, это работает для меня. Это то, что я обычно делаю:
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"));
Ответ 2
Вы можете использовать функцию-js с everyauth, которая очень похожа на CanCan for Rails https://github.com/scottkf/ability-js
Ответ 3
Взгляните на этот список для систем NodeJS ACL/Permission. IMHO Оптимальные биты node_acl выглядит лучше всего.
Ответ 4
Теперь для этого используется Node модуль permission. Он очень прост в использовании, очень похож на принятый ответ, но при этом добавляются некоторые функции.