2014-07-23 1 views
4

Yeoman Generator Angular Fullstack 생성기로 생성 된 평균 스택 앱이 있습니다. 당신은 로그인하여 사이트에 액세스 할 수 있어야합니다.Express/Passport, AngularJS 및 ensureLoggedIn이 "/"url에서 작동하지 않는 인증 및 라우팅

을 ensureLoggedIn의 환매 특약은 내가로 리디렉션 해요 '/ 제품'으로 이동하려고하면 here

동안은, 로그 아웃 '/ 로그인'단지 벌금. 그러나 URL이 '/'또는 'localhost : 9000'인 경우 로그인하지 않은 사용자를 슬래시없이 리디렉션하는 문제가 있습니다.

로그인 화면이 아니고 로그인 화면에서 '/ login'을 '/'또는 ''로 변경하면 AngularJS의 'main'으로 보내 져서 로그인 한 것으로 취급됩니다. 세션을 인식했기 때문에 가정하니?) '/ products'또는 '/ users'까지 링크를 클릭 할 수 있습니다.

나의 현재 routes.js은 다음과 같습니다 : 나는 또한 경로로 이것을 시도했습니다

/** 
* Main application routes 
*/ 

'use strict'; 

var errors = require('./components/errors'); 
var auth = require('./controllers/auth'); 
var passport = require('passport'); 
var ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn; 
module.exports = function(app) { 

// Insert routes below 
// All undefined asset or api routes should return a 404 
    app.route('/:url(api|auth|components|app|bower_components|assets)/*').get(errors[404]); 
    app.route('/login').get(auth.login).post(auth.loginUser); 
    app.route('/logout').get(auth.logout); 
    // All other routes should redirect to the index.html 
    app.all('*', ensureLoggedIn('/login')); 
    app.route('/*').get(function(req, res) { 
     res.sendfile(app.get('appPath') + '/index.html'); 
    }); 
}; 

:

app.route('/*').get(function(req, res) { 
    res.sendfile(app.get('appPath') + '/index.html'); 
}); 

어떤 응용 프로그램에 ensureLoggedIn 배치와 같은 동작을 갖고있는 것 같아요. 모든.

.config ($stateProvider, $urlRouterProvider, $locationProvider) -> 
    $httpProvider.interceptors.push('httpInterceptor') 

    $urlRouterProvider 
     .otherwise '/' 

    $stateProvider 
     .state 'main', 
      url: '/' 
      templateUrl: 'app/views/main/main.html' 
      controller: 'MainCtrl' 
     .state 'users', 
      url: '/users' 
      templateUrl: 'app/views/users/index.html' 
      controller: 'UsersController' 

내가 말했듯이, 리디렉션가 '/ 사용자에 잘 작동 :

다음은 UI 라우터를 사용하여 각 측면에 내 라우팅의 조각입니다. 이것이 라우팅 문제인지 또는 인증 문제인지 확실하지 않습니다. 로그 아웃을 클릭하면 로그인 화면으로 들어가고 액세스가 제한되지만 '/'경로에 대한 액세스는 제한되지 않으므로 인증은 정상적으로 진행됩니다.

보기의 경우 login.jade는 실제로 서버 측에 있고 양식이 거기에서 처리됩니다. 404.jade를 제외하고 다른 모든보기는 클라이언트 측에 있고 ui-router를 사용하여 제공됩니다.

나는 기본적인 것을 간과하고있는 것처럼 느껴집니다. 또는 이것이 어떻게 함께 작동하는지 완전히 이해하지 못합니다. 어떤 도움이라도 좋을 것입니다.

편집 :

app.route('/') 
    .get(function(req, res) { 
     res.render('login'); 
    }); 

그리고 '/'로에서 주를위한 UI 라우터의 URL을 변경 : 나는 app.route 전에 라우팅 ('로그인')을 변경 한 시도

한 가지 '/본관'.

이것은 여전히 ​​index.html을 가로 채고 로깅 한 것이므로 작동하지 않았습니다. 또한 res.redirect를 routes.js에 로그인하려고 시도했지만 리디렉션하지 않았습니다.

답변

0

인증을 처리하는 데 사용하는 코드입니다. 해킹이지만 코드를 작성해야 할 때 더 나은 방법을 찾지 못했습니다. 또한 시스템에 정의 된 경로는 사용자마다 다양하므로 일반적인 구성 단계에서는이를 정의 할 수 없었습니다. 그래도 문제가 해결 될 수 있습니다.

$routeProvider 
    .when("/login", { templateUrl: "/view/account/login.html", controller: Login }) 
    .when("/forgottenpassword", { templateUrl: "/view/account/forgottenpassword.html", controller: ForgottenPassword }) 
    .otherwise({ redirectTo: "login" }); 

이렇게하면 기본적으로 2 개의보기에만 액세스 할 수 있습니다. 누군가가 성공적으로 인증되면 새로운 유효한보기로 라우팅 테이블을 다시 작성합니다. 잘못된 탐색이 로그인보기로 이동합니다.

나는 이것을 해킹을 통해 수행하지만, 가장 좋은 구현 방법은 angularjs가 아닙니다. 창 개체에 $routeProvider에 대한 참조를 유지 한 다음 정상적으로 로그온하면 $routeProvider을 사용합니다.

각도로 제공된 원래 $ routeProvider에는 기존 경로를 지우고 새 경로를 추가하기위한 공용 메소드가 필요합니다.

var routes = {}; 

후 성공적으로 로그온 한 후

this.ClearRoutes = function() 
    { 
     routes = {}; 
    } 

사용 예제를 추가

$routeProvider.ClearRoutes(); 

$routeProvider 
    .when("/home", { templateUrl: "/view/home.html", controller: Home }) 
    .when("/logoff", { templateUrl: "/view/account/logoff.html", controller: Logoff }) 
    .otherwise({ redirectTo: "home" }); 
관련 문제