2016-04-07 3 views
1

implementiert ich eine sehr einfache Middleware, die Berechtigungen für den Benutzer zu überprüfen:NodeJS Express: Wie unterbricht man das Routing von außerhalb der Middleware/Router?

app.js

... 
var security = require('./lib/security'); 
app.use(security.init); 
... 

lib/security.js

var session; 
var request; 
var response; 

function init(req, res, next) { 
    request = req; 
    response = res; 
    session = req.session; 
    next(); 
} 

function adminRequired(){ 
    if (!isAdmin()){ 
    response.redirect('/login'); 
    response.end(); 
    return true; 
    } 
    return false; 
} 
... 

Der beste Weg, ich gefunden, um den Fluss zu unterbrechen, ist der folgende:

Routen/mycontroller.js

router.get('/', function(req, res, next) { 
    if(security.adminRequiredHtml()){return;} // now it actually interrupt the execution 
    res.render('admin',{}); 
    res.end(); 
}); 

aber ich möchte es so verwenden:

Routen/mycontroller.js

router.get('/', function(req, res, next) { 
    security.adminRequiredHtml(); // <- interrupt the request 
    res.render('admin',{}); 
    res.end(); 
}); 

Es die Umleitung richtig auszuführen, aber die Ausführung geht weiter :(
Ich habe ein paar Lösungen versucht, aber es funktioniert nicht wirklich:
response.end() -> die Ausgabe schließen aber setzt die Ausführung
process.end() -> es ist zu radikal, beendet die Ausführung, aber es tötet auch den Server :(

Ich habe eine throw über die Verwendung nachgedacht, aber ich weiß nicht, wo es zu fangen und es anmutig zu beenden (kein Stacktrace)

+0

es ist unelegant und kann zu Verwirrung (und folglich zu einer Sicherheitsstrom) aufgrund der führen Tatsache, dass das Ergebnis auf dem Browser korrekt ist, aber die Ausführung fortgesetzt. – Cesar

Antwort

1

Sie suchen eigentlich nach Middleware, denke ich.

Sie können so viele verketten, wie Sie mit der Logik arbeiten möchten, die Sie benötigen. Stell einfach sicher, dass du next() anrufst, wenn du weitermachen willst!

1

Sie können einen benutzerdefinierten Router erstellen, die gesichert ist und fügen Sie Ihre sichere Routen zu, dass:

var secureRouter = express.Router(); 
// every request on this router goes throug this 
secureRouter.use('*', function (req, res, next) { 
    if(isAdmin()) next(); 
    // if you don't call next() you interrupt the request automaticly 
    res.end(); 
}); 

// protected routes 
secureRouter.get('/user', function(req, res){/* whatever */}); 
secureRouter.post('/user', function(req, res){/* whatever */}); 

app.use(secureRouter); 

// not protected 
app.get('/api', function(req, res){/* whatever */}); 

Express doc for using middlewares

+0

Ich möchte es direkt in der Controller-Methode verwenden können, die Frage ist, wie man das Routing elegant unterbricht. – Cesar

+0

Rufe einfach next() nicht auf und das Routing endet in deinem aktuellen Handler. –

+0

Hem, ich möchte in der Lage sein, es zu benutzen, wie es eine "Annotation" war, auf diese Weise kann ich einfach einzelne Methoden oder nur das "Put" schützen, aber nicht das "Get" derselben URL – Cesar