NodeJS + Express: comment sécuriser une URL

j'utilise les dernières versions de NodeJS et ExpressJS (pour MVC).

je configure habituellement mes chemins de repos comme ceci, par exemple:

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

Maintenant, je veux mon /admin/* jeu D'URLs à sécuriser, je veux dire que j'ai juste besoin d'une authentification simple, c'est juste un brouillon.

Lorsqu'un utilisateur tente d'accéder, par exemple, /admin/posts, avant de lui envoyer la vue et les données correspondantes, je vérifie une réponse.session.authentifier. Si ce n'est pas défini, je redirige vers le login page.

la page de connexion a un formulaire de validation simple, et une méthode de contrôleur de connexion: si l'utilisateur envoie "bon utilisateur" et" bon mot de passe " j'ai défini la variable de session et il est authentifié.

Ce que je trouve difficile, ou je ne comprends pas, c'est comment l' "filtre" code, je veux dire, la vérification d'auth, avant chaque appel de chemin /admin/*.

est-ce que cela a quelque chose à voir avec les fonctions "middleware" express?

Merci vous

21
demandé sur Fabio B. 2012-09-05 10:57:24

3 réponses

Yep, middleware est exactement ce que vous voulez. Une fonction middleware est juste une fonction qui fonctionne comme n'importe quel autre gestionnaire de route Express, sauf qu'elle est exécutée avant votre gestionnaire de route réel. Vous pourriez, par exemple, faire quelque chose comme ceci:

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

Vous pouvez spécifier requireLogin comme un middleware des routes que vous voulez protéger, au lieu d'utiliser le app.all appel /admin/*, mais le faire comme je le montre ici assure que vous ne pouvez pas oubliez accidentellement de l'ajouter à n'importe quelle page qui commence par /admin.

65
répondu Michelle Tilley 2012-09-05 07:05:05

Une même approche la plus simple serait d'ajouter le code suivant dans l'Application.fichier js.

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

    if(isAdmin) {

        return next();

    } else {

        return res.status(400)

    }
};

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

comme vous pouvez le voir, l'middleware est attaché à la route. Avant D'aller de l'avant, ExpressJS exécute la fonction que vous avez passée comme second paramètre.

Avec cette solution vous pouvez faire différentes vérifications avant d'afficher le site à l'utilisateur final.

le Mieux.

2
répondu David Gatti 2015-12-05 19:06:01

comme brandon, mais vous pouvez aussi aller le connect route

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

app.get('/admin/posts', /* middleware */)
1
répondu Jonathan Ong 2012-09-05 08:58:09