2012-01-04 40 views
6

Tôi đang cố gắng sử dụng phần mềm trung gian authenticateUser() trước khi tải tất cả các trang của tôi. Thay vì bao gồm nó trong mỗi cuộc gọi (như trong app.get ('/', authenticateUser, function() ...)), tôi đã thử thiết lập nó với app.use (authenticateUser) ngay trước khi gọi app.use (app.router).Node.js - Vấn đề với res.redirect trong phần mềm trung gian

Điều này không hiệu quả. authenticateUser về cơ bản là:

if (req.session.loginFailed) { 
    next() 
else { 
    if (req.session.user_id) { 
     ... 
     if (userAuthenticated) { 
      next(); 
     } else { 
      req.session.loginFailed = true; 
      console.log('setting loginFailed to true'); 
      res.redirect('/login'); 
     } 
    } 
} 

Và sau đó trong app.get ('/ login') Tôi thiết req.session.loginFailed là sai;

Điều này sẽ hiệu quả, nhưng tôi chỉ muốn gọi nó trên app.get() hoặc app.post(), v.v ... cho một trong các trang thực tế của tôi. Tôi nghĩ rằng nó được gọi nhiều lần cho nhiều yêu cầu khác nhau (vì khi tải một trang, 'thiết lập đăng nhậpĐược gọi là đúng' được gọi nhiều lần)

Có cách nào tốt hơn để làm điều này? Hoặc tôi chỉ nên gọi nó trước mỗi trang trên trang web của tôi?

Trả lời

9

Bạn đang thực hiện quá nhiều kiểm tra ngoài ý kiến ​​của tôi. Chỉ có một tuyến đường nên xử lý thông tin đăng nhập của người dùng (kiểm tra cho người dùng & vượt qua và lưu tên người dùng trong phiên nếu thành công) và bạn chỉ nên gán phần mềm trung gian auth trên các tuyến đường yêu cầu auth (không phải tất cả).

Tôi đã đưa ra một ví dụ đơn giản để bạn có thể hiểu được quan điểm của tôi:

Tuyến đăng nhập

app.post('/login', function (req, res) { 
    var variables_set = (req.body.user && req.body.pass); 
    if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) { 
    req.session.username = req.body.user; 
    } else { 
    res.redirect('/login?failed=true'); 
    } 
}); 

Các middleware auth

if (!req.session.username) { 
    res.redirect('/login'); 
} else { 
    next(); 
} 

Bạn có thể thấy một ví dụ hoàn chỉnh hơn trong hành động trong ứng dụng Nodepad của Alex Young: https://github.com/alexyoung/nodepad (hướng dẫn cho ứng dụng đó tại đây: http://dailyjs.com/tags.html#lmawa)

+1

Đủ công bằng, thật vui vì tôi đã thực sự làm việc với các hướng dẫn về nodepad. Vấn đề là toàn bộ trang web của tôi yêu cầu bạn đăng nhập, vì vậy tôi đã tấn công một cách để không phải tự bao gồm nó trên tất cả các tuyến đường, nhưng tôi sẽ chỉ bao gồm nó nếu đó là cách thích hợp. –

+0

Tôi đồng ý với @alessioalex. Tuy nhiên, nếu bạn nhấn mạnh vào cách tiếp cận mà bạn đã đặt ra, hãy đảm bảo rằng 'app.use (authenticateUser)' của bạn là SAU phần mềm trung gian phiên. – danmactough

Các vấn đề liên quan