2012-09-05 12 views
19

Sto usando le ultime versioni di NodeJS e ExpressJS (per MVC).NodeJS + Express: Come proteggere un URL

Io di solito configurare il mio percorsi di riposo in questo modo, per esempio:

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

ora voglio la mia /admin/* insieme di URL da fissare, voglio dire che ho bisogno di autenticazione solo semplice, è solo una bozza.

Quando un utente tenta di accedere, ad esempio, /admin/posts, prima di inviargli la vista e i dati corrispondenti, controllo un req.session.authenticated. Se non è definito, reindirizzamento alla pagina di accesso.

La pagina di accesso ha un semplice modulo di convalida e un metodo di controllo di accesso: se l'utente invia "utente corretto" e "password corretta", imposto la variabile di sessione e lui è autenticato.

Quello che trovo difficile, o non capisco, è come effettivamente rendere il codice "filtro", intendo, il controllo di autenticazione, prima di ogni chiamata di percorso/admin/*.

Ha qualcosa a che fare con le funzioni espresse "middleware"?

Grazie

risposta

59

Sì, il middleware è esattamente quello che vuoi. Una funzione middleware è solo una funzione che funziona come qualsiasi altro gestore di route Express, si aspetta che venga eseguita prima del gestore di route effettivo. Si potrebbe, ad esempio, fare qualcosa di simile:

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

è possibile specificare requireLogin come un middleware per ciascuna dei percorsi che si desidera essere protetto, invece di utilizzare la chiamata app.all con /admin/*, ma farlo il modo in cui mostro qui garantisce che non è possibile dimenticarsi accidentalmente di aggiungerlo a qualsiasi pagina che inizia con /admin.

+1

wow .... così StackOverflow funziona, a volte! : D ehehe Grazie, è esattamente il tipo di risposta che mi aspettavo. Proverò nel pomeriggio e accetto la tua risposta eccellente se tutto funziona. THX di nuovo –

+0

Felice di aiutare! Fateci sapere se avete ulteriori domande su questo problema!^_^ –

+0

Qual è la differenza con l'utilizzo del token? –

1

come Brandon, ma si può anche andare via connect

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

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

cosa intendi? : - \ –

1

Un approccio ancora più semplice sarebbe quella di aggiungere il seguente codice nel file App.js.

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

    if(isAdmin) { 

     return next(); 

    } else { 

     return res.status(400) 

    } 
}; 

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

Come si può vedere il middleware è stato allegato al percorso. Prima che ExpressJS vada avanti, esegue la funzione che hai passato come secondo parametro.

Con questa soluzione è possibile effettuare diversi controlli prima di visualizzare il sito all'utente finale.

Migliore.

Problemi correlati