2012-01-04 5 views
6

모든 페이지를로드하기 전에 authenticateUser() 미들웨어를 사용하려고합니다. (app.get ('/', authenticateUser, function() ...)과 같이 각 호출에 포함하는 대신 app.use (authenticateUser)를 app.use (app.router)를 호출하기 전에 설정하려고했습니다.).Node.js - 미들웨어의 res.redirect 관련 문제

그러나 이것은 작동하지 않았습니다.

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

그리고 app.get ('/ 로그인')에 나는 거짓으로 req.session.loginFailed를 설정;에서 AuthenticateUser은 기본적으로

이 방법이 효과적 일 수 있지만 내 실제 페이지 중 하나에 대해서만 app.get() 또는 app.post() 등으로 호출하고 싶습니다. 나는 많은 다른 요청에 대해 많은 시간을 필요로한다고 생각한다. (하나의 페이지를 로딩 할 때 'loginFailed를 true로 설정하면'이 여러 번 호출되기 때문에)

더 좋은 방법이 있습니까? 아니면 단순히 내 사이트의 모든 페이지보다 먼저 호출해야합니까?

답변

9

내 의견으로는 너무 많은 체크를하고 있습니다. 하나의 라우트 만 사용자 로그인을 처리해야하며 (사용자 & 통과를 확인하고 성공하면 세션에 사용자 이름을 저장하십시오) auth 미들웨어를 인증이 필요한 라우트에만 지정해야합니다 (모두는 아 T).

당신이 내 지점을 이해할 수 있도록 나는 간단한 예를 넣어했습니다

로그인 경로

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

정식 미들웨어

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

당신은 볼 수 있습니다 Alex Young의 Nodepad 응용 프로그램에서 작동하는보다 완벽한 예 : https://github.com/alexyoung/nodepad (해당 응용 프로그램에 대한 자습서는 여기 : http://dailyjs.com/tags.html#lmawa)

+1

충분히 재미 있습니다. 사실은 노다 ​​패드 튜토리얼을 실제로 사용했기 때문입니다. 문제는 내 전체 사이트에 로그인해야한다는 것입니다. 따라서 모든 경로에 수동으로 포함시키지 않아도되는 방식으로 해킹했습니다. 그러나 적절한 방법이 있다면 포함시켜야합니다. –

+0

@alessioalex에 동의합니다. 그래도 접근법을 고집한다면, 당신의'app.use (authenticateUser)'가 세션 미들웨어 이후에 있는지 확인하십시오. – danmactough