2013-06-13 3 views
1

ExpressJS + AngularJS를 실험하기 시작했으며 스트레스가 많은 상황에 처했습니다.하나만 제외하고 모든 경로에 대한 액세스 제한

내 목표는 로그인 페이지와 대시 보드 페이지를 하나씩 사용하고 Passport + MongoDB를 사용하여 사용자를 인증하고 자격 증명이 맞으면 대시 보드 페이지로 리디렉션합니다.

나는 angular-express-seed 시작하고 그래서 앞서 언급 한 전망을 결국 수정 한 :

$routeProvider. 
    when('/login', { 
     templateUrl: 'partials/login', 
     controller: 'LoginCtrl' 
    }). 
    when('/dashboard', { 
     templateUrl: 'partials/dashboard', 
     controller: 'DashboardCtrl' 
    }). 
    otherwise({ 
     redirectTo: '/login' 
    }); 

나는 각 부분 뷰를 제공하고 있습니다 :

app.get('/partials/:name', routes.partials); 


exports.partials = function (req, res) { 
    var name = req.params.name; 
    res.render('partials/' + name); 
}; 

로그인 시스템을 대시 보드에 직접 액세스 할 수있는 부분을 제외하고는 (로그인하지 않고) 올바르게 작동합니다.

사용자가 대시 보드 (또는 해당 영역의 다른 영역)에 대한 액세스 권한을 부여하기 전에 인증되었는지 여부를 알아야합니다.

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login'); 
} 

내가 여기에 일부

app.get('/partials/:name', ensureAuthenticated, routes.partials); 

큰 문제로 모든 GET에 부를 것이다는 로그인보기도 부분이라는 것이다 :

나는 트릭을 수행하는이 발견 , 그리고 내가보기를 요청할 때 ensureAuthenticated이 실행되는 것을 원하지 않습니다.

현재 부분 요청마다 ensureAuthenticated을 호출하면 브라우저가 충돌하고 오류는 없습니다.

function ensureAuthenticated(req, res, next) { 
     if (req.route.params.name !== 'login' && req.isAuthenticated()) { return next(); } 
     res.redirect('/login'); 
    } 

또한 ensureAuthenticated를 사용 app.GET 아니라 자신에 로그인보기를 호출 시도했지만 어떻게 든 각도는 오프 화나게하지조차 않는 : 내가 지금까지 시도했습니다 (그리고 작동하지 않았다) 어떤

하중.

해결 방법에 대한 아이디어가 있으십니까?

미리 감사드립니다.

답변

1

ensureAuthenticated의 첫 번째 버전 (수정되지 않은 버전)이 브라우저를 크래시하거나 최신 버전 (/partials/login을 확인한 버전)이 어떤 경우에도 발생하지 않아도되는지는 분명치 않습니다 ('크래시' 이 위해라고하면

app.get('/partials/login', routes.partials); 
app.get('/partials/:name', ensureAuthenticated, routes.partials); 

귀하의 routes.partials 명시 적으로 확인해야합니까 : 당신은 '포장 마차'를 의미, 그 Express는 응답)

그러나 대안으로, 이것을 시도를 다시 전송하지의 고자질하는 기호입니다 이 경우 로그인 경로는 name 매개 변수에 존재하지 않으므로 req.params.

그냥 확인하십시오 : /login에 대한 서버 측 처리기가 있습니까? 그렇지 않으면 res.redirect('/login')이 작동하지 않습니다.

+0

app.get ('/ partials/login', routes.partials)을 추가하십시오. 이름 매개 변수 검사가 작동하도록합니다. 그래도 문제가 생기면 로그인하고 대시 보드로 이동 한 다음 세션 쿠키를 정리하고 새로 고침하여/login으로 리디렉션되는지 확인합니다. 그것은 로그인보기를 보여 주지만 URL은 여전히 ​​on/dashboard를 말합니다. 그 이유는 무엇입니까? – mfreitas

+0

그래, 내/로그인 핸들러에서 반환했기 때문에 로그인보기가 표시됩니다. res.redirect ('/ login')하지 않아야합니다. 리디렉션? 대신 내 app.get ('/ login', routes.login); 반환 res.render ('부분/로그인'); – mfreitas

+0

@mfreitas Angular가 부분을 요청하기 때문에 AJAX 호출 중에 리디렉션이 전송됩니다. 따라서 AJAX 호출은 기본 페이지 URL이 아니라 리디렉션됩니다. – robertklep

1

저는 XHR 요청으로 리디렉션하는 서버 측이 좋은 방법이라고 생각하지 않습니다. XHR 요청은 사용자가 승인되지 않았고 클라이언트 측 (Angular)이 알림 메시지를 표시하고 사용자를 로그인 부분으로 리디렉션하는 조치를 취해야하는 경우 401을 리턴해야합니다. 이러한 요청을 처리하려면 this project을보십시오. demoblog post이 있습니다.

관련 문제