2016-04-07 7 views
1

は、私は、ユーザーの権限をチェックするために非常に単純なミドルウェアを実装:NodeJS Express:ミドルウェア/ルータの外部からのルーティングを中断する方法は?

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

最良の方法Iフローを中断することがわかりました:

ルート/ mycontroller.js

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

しかし、私はこのようにそれを使用したいと思います:

ルート/ mycontroller.js

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

それは正しくリダイレ​​クトを実行、実行は続行されます:(
私はいくつかのソリューションを試しましたが、実際には機能しません。
response.end() - >出力を閉じますが、実行
process.end()を継続 - >それは、あまりにも過激だ実行を終了しますが、それはまた、サーバーを殺す:(

私はthrowの使用について考えてきたが、私は知りませんどこにキャッチして正常に終了させるか(スタックトレースなし)

+0

それが原因に洗練だと混乱につながる可能性があり(その結果、セキュリティフローへ)実際にはブラウザ上の結果は正しいが、実行は続けられた。 – Cesar

答えて

1

あなたは実際にミドルウェアを探しています。

function myMiddleware (req, req, next) { 
    if (!isAdmin()) { 
     res.redirect('/login'); 
     res.end(); 
    } else { 
     //Proceed! 
     next() 
    } 
} 

router.get('/', myMiddleware, function(req, res, next) { 
    res.render('admin',{}); 
    res.end(); 
}); 

必要なロジックを何でも処理することができます。初めて移動する場合はnext()に電話してください!

1

あなたはそれにあなたの安全なルートを確保しているカスタムルーターを作成して追加することができます。

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

私はコントローラーメソッドで直接使用できるようにしたいと思いますが、問題はルーティングを正常に中断する方法です。 – Cesar

+0

next()を呼び出さないと、ルーティングは現在のハンドラで終了します。 –

+0

裾、「注釈」のように使用することができます。この方法で簡単に単一のメソッドを保護することも、同じURLの「取得」することもできません。 – Cesar

関連する問題