要处理身份验证,我使用$ 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包含查询字符串
,任何想法,如何处理身份验证答案 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