Node.js + Express.js Модель захисту дозволів користувача


79

У нас є програма, яка має два типи користувачів. Залежно від способу входу користувача, ми хочемо, щоб він мав доступ до різних частин програми.

Як ми реалізуємо модель безпеки, щоб запобігти користувачам бачити речі, до яких вони не мають доступу?

Чи робимо ми безпеку частиною реалізації кожного маршруту? Проблема полягає в тому, що ми матимемо певну логіку в запитах. Ми могли б перенести це у допоміжні функції, але нам все одно потрібно пам’ятати про його виклик.

Чи робимо ми безпеку частиною глобального обробника маршруту app.all ()? Проблема полягає в тому, що нам доводиться оглядати кожен маршрут і робити різну логіку на основі безлічі правил. Принаймні весь код знаходиться в одному місці, але тоді ... весь код знаходиться в одному місці.

Відповіді:


137

Наявність його на маршруті, як правило, працює для мене. Це те, що я зазвичай роблю:

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 ролі можуть отримати доступ до маршруту?
Володимир Джукіч

1
Ви можете requireRoleзамість цього взяти масив? І уточніть у indexOf.
Лінус Тіль

Не могли б ви додати приклад? Чи захищає цей останній маршрут усі маршрути, які починаються з / foo / bar?
Володимир Джукіч

Що робити, якщо дозволи на базу даних змінено? Як можна переконатися, що сеанс відповідає базі даних?
nomadoda

2
@nomadoda мені здається трохи іншою проблемою, але вам доведеться якось оновити сесію. Це залежить від того, який магазин резервної копії сеансу ви використовуєте, найпростішим було б дозволити користувачеві ввійти знову після такого типу змін.
Лінус Тіль



3

Зараз для цього є дозвіл на модуль Node . Він дуже простий у використанні, дуже схожий на прийняту відповідь, але все ж деякі функції додані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.