AngularJS身份验证问题与查询参数?

时间:2013-12-21 12:21:01

标签: javascript angularjs

要处理身份验证,我使用$ locationChangeStart。我的代码适用于 routeProvider ,它不包含任何参数或查询字符串。如果路由提供程序包含任何查询参数,则我的代码无法正常工作。

app.config(['$routeProvider', function($routeProvider,$locationProvider) {
    $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'AuthController',auth:false});
    $routeProvider.when('/register', {templateUrl: 'partials/signup.html', controller: 'AuthController',auth:false});
    $routeProvider.when('/', {templateUrl: 'partials/:id', controller: 'TestCntrl',auth:false});
    $routeProvider.otherwise({redirectTo: '/login'});
}]).run(function($rootScope, $route, $location, AutenticationService) {

    $rootScope.$on('$locationChangeStart', function(ev, next, current) {

        var nextPath = $location.path();
        var nextRoute = $route.routes[nextPath]

        if(nextRoute.auth && !AutenticationService.isLoggedIn()){
            $location.path("/login");
            // event.preventDefault();
        }
    });
})

在上面的代码中, nextRoute 检查映射网址并获取属性 auth ,如果url包含查询参数nextRoute.auth,则会出现在$ routeProvider.But中未定义。因为如果此身份验证不起作用。

如果URL包含查询字符串

,任何想法,如何处理身份验证

1 个答案:

答案 0 :(得分:2)

只需添加一项检查,看看nextRoute是不是假的(即未定义)。当第一个路线改变被触发时,我遇到了这个问题。初始路径通常是一个空字符串,任何路由都不会引用它。

if(nextRoute && nextRoute.auth && !AutenticationService.isLoggedIn()){
    $location.path("/login");
}

这是一个稍微修改过的例子。您可以在控制台中看到位置发生变化。 http://plnkr.co/edit/oE2Ew8C68t8k8EgKNqtz?p=preview

另一种选择是利用这个项目: https://github.com/fnakstad/angular-client-side-auth

这是一个有效的演示: http://angular-client-side-auth.herokuapp.com/login