2012-09-05 3 views
19

Ich bin mit neuesten Versionen von NodeJS und Express.js (für MVC).NodeJS + Express: Wie man eine URL sichern

ich in der Regel meine Ruhe Pfade wie dies zum Beispiel konfigurieren:

app.get('/archive', routes.archive); 

Jetzt möchte ich meine /admin/* Satz von URLs gesichert werden, ich meine, ich brauche nur einfache Authentifizierung, es ist nur ein Entwurf.

Wenn ein Benutzer versucht, z. B. auf /admin/posts zuzugreifen, bevor ich ihm die entsprechende Ansicht und Daten sende, suche ich nach einer req.session.authenticated. Wenn es nicht definiert ist, leite ich auf die Anmeldeseite um.

Die Anmeldeseite hat ein einfaches Validierungsformular und eine Anmelde-Controller-Methode: Wenn der Benutzer "Right User" und "Right Password" sendet, setze ich die Session-Variable und er ist authentifiziert.

Was ich schwierig finde, oder ich verstehe nicht, ist, wie man den "Filter" Code wirklich macht, ich meine, die Auth-Kontrolle, vor jedem/admin/* Pfad Anruf.

Hat das etwas mit "Middleware" Express-Funktionen zu tun?

Danke

Antwort

59

Yep, Middleware ist genau das, was Sie wollen. Eine Middleware-Funktion ist nur eine Funktion, die genau wie jeder andere Express-Route-Handler funktioniert, vorausgesetzt, er wird vor dem eigentlichen Routen-Handler ausgeführt. Sie könnten zum Beispiel so etwas wie folgt aus:

function requireLogin(req, res, next) { 
    if (req.session.loggedIn) { 
    next(); // allow the next route to run 
    } else { 
    // require the user to log in 
    res.redirect("/login"); // or render a form, etc. 
    } 
} 

// Automatically apply the `requireLogin` middleware to all 
// routes starting with `/admin` 
app.all("/admin/*", requireLogin, function(req, res, next) { 
    next(); // if the middleware allowed us to get here, 
      // just move on to the next route handler 
}); 

app.get("/admin/posts", function(req, res) { 
    // if we got here, the `app.all` call above has already 
    // ensured that the user is logged in 
}); 

Sie requireLogin als Middleware zu jeder der Routen angeben, können Sie geschützt werden soll, anstelle der Verwendung des app.all Anruf mit /admin/*, aber es tut Die Art und Weise, wie ich hier zeige, stellt sicher, dass Sie nicht versehentlich vergessen können, es zu jeder Seite hinzuzufügen, die mit /admin beginnt.

+1

wow .... so DOES Stackoverflow Arbeit, manchmal! : D ehehe Danke, es ist genau die Art von Antwort, die ich erwartet habe. Ich werde es am Nachmittag versuchen und Ihre ausgezeichnete Antwort akzeptieren, wenn alles klappt. THX wieder –

+0

Gut zu helfen! Lassen Sie uns wissen, wenn Sie weitere Fragen zu diesem Thema haben!^_^ –

+0

Was ist der Unterschied zur Verwendung von Token? –

1

Wie brandon, aber Sie können auch die connect Route

app.use('/admin', requireLogin) 
app.use(app.router) 

app.get('/admin/posts', /* middleware */) 
+3

was meinst du? : - \ –

1

Eine noch einfachere Methode den folgenden Code in der App.js Datei hinzuzufügen wäre gehen.

var auth = function(req, res, next) { 

    if(isAdmin) { 

     return next(); 

    } else { 

     return res.status(400) 

    } 
}; 

app.use('/admin', auth, apiDecrement); 

Wie Sie sehen können, wird die Middleware an die Route angehängt. Bevor ExpressJS fortfährt, führt es die Funktion aus, die Sie als zweiten Parameter übergeben haben.

Mit dieser Lösung können Sie verschiedene Prüfungen durchführen, bevor Sie die Site dem Endbenutzer anzeigen.

Am besten.