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.

Travis Parks
quelle

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"));
Linus Thiel
quelle
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
7

Sehen Sie sich diese Liste für NodeJS ACL / Permission-Systeme an. IMHO OptimalBits node_acl sieht am besten aus.

McMeep
quelle
1
Gibt es eine neuere Liste von Node.js ACL-Modulen? Wir überlegen, wie ACL in einer Meteor.js-App implementiert werden kann.
Brylie Christopher Oxley
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.

Tommz
quelle