Node.js + Express.js Sicherheitsmodell für Benutzerberechtigungen


78

Wir haben eine Anwendung, die zwei Arten von Benutzern hat. Abhängig davon, wie sich der Benutzer anmeldet, möchten wir, dass er Zugriff auf verschiedene Teile der Anwendung hat.

Wie implementieren wir ein Sicherheitsmodell, um zu verhindern, dass Benutzer Dinge sehen, auf die sie keinen Zugriff haben?

Machen wir die Sicherheit zu einem Teil jeder Routenimplementierung? Das Problem ist, dass wir über Anfragen hinweg eine doppelte Logik haben werden. Wir könnten dies in Hilfsfunktionen verschieben, aber wir müssten immer noch daran denken, es aufzurufen.

Machen wir Sicherheit zu einem Teil eines globalen app.all () -Routenhandlers? Das Problem ist, dass wir jede Route überprüfen und unterschiedliche Logik basierend auf einer Vielzahl von Regeln ausführen müssen. Zumindest befindet sich der gesamte Code an einem Ort, aber dann ... befindet sich der gesamte Code an einem Ort.

Antworten:


134

Es funktioniert normalerweise für mich, wenn ich es pro Route habe. Das mache ich normalerweise:

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"));

Was aber, wenn nur zwei Rollen auf die Route zugreifen können?
Vladimir Djukic

1
Sie könnten requireRolestattdessen ein Array nehmen? Und erkundigen Sie sich bei indexOf.
Linus Thiel

Könnten Sie ein Beispiel hinzufügen? Schützt diese letzte Route alle Routen, die mit / foo / bar beginnen?
Vladimir Djukic

Was ist, wenn die Berechtigungen für die Datenbank geändert werden? Wie würde man sicherstellen, dass die Sitzung mit der Datenbank übereinstimmt?
Nomadoda

2
@nomadoda es scheint mir ein etwas anderes Problem zu sein, aber du müsstest die Sitzung irgendwie aktualisieren. Dies hängt davon ab, welchen Sitzungssicherungsspeicher Sie verwenden. Am einfachsten ist es, den Benutzer nach dieser Art von Änderung erneut anmelden zu lassen.
Linus Thiel



3

Hierfür gibt es jetzt die Berechtigung des Knotenmoduls. Es ist sehr einfach zu bedienen, sehr ähnlich zu akzeptierten Antworten, aber es werden noch einige Funktionen hinzugefügt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.