Javascript 在AngularJS应用程序中通过身份验证保护路由
我的一些AngularJS路由指向需要使用我的API对用户进行身份验证的页面。在这些情况下,我希望将用户重定向到登录页面,以便他们能够进行身份验证。例如,如果客户访问Javascript 在AngularJS应用程序中通过身份验证保护路由,javascript,angularjs,authentication,Javascript,Angularjs,Authentication,我的一些AngularJS路由指向需要使用我的API对用户进行身份验证的页面。在这些情况下,我希望将用户重定向到登录页面,以便他们能够进行身份验证。例如,如果客户访问/account/settings,则应将其重定向到登录表单 从头脑风暴中,我想到了监听$locationChangeStart事件,如果是需要验证的位置,则将用户重定向到登录表单。我可以在我的应用程序run()event: .run(['$rootScope', function($rootScope) { $rootSc
/account/settings
,则应将其重定向到登录表单
从头脑风暴中,我想到了监听$locationChangeStart
事件,如果是需要验证的位置,则将用户重定向到登录表单。我可以在我的应用程序run()
event:
.run(['$rootScope', function($rootScope) {
$rootScope.$on('$locationChangeStart', function(event) {
// Decide if this location required an authenticated user and redirect appropriately
});
}]);
下一步是保留需要身份验证的所有应用程序路由的列表,因此我尝试将它们作为参数添加到我的$routeProvider
:
$routeProvider.when('/account/settings', {templateUrl: '/partials/account/settings.html', controller: 'AccountSettingCtrl', requiresAuthentication: true});
但是我看不到从$locationChangeStart
事件中获取requireauthentication
密钥的任何方法
我是不是想得太多了?我试图为Angular找到一种本机实现这一点的方法,但什么也找不到。我在我的项目中使用。如果您有一个后端,那么在它上面委托它来处理身份验证(在每个401响应中自动显示一个登录表单)比在客户端和服务器上复制身份验证映射更容易。我所做的是实现一个angularjs拦截器来处理http请求错误。基本上,我所做的是当我从后端获得401(未经授权)时,保存当前url并将用户重定向到登录页面。当用户成功登录时,我检索保存的url以使用$location设置路径
app.config(function ($routeProvider, $locationProvider, $httpProvider) {
/* Global interceptor for 401 - not authorized */
var interceptor = ['$location', '$q', 'authorizationService', function ($location, $q, authorizationService) {
function success(response) {
return response;
}
function error(response) {
if (response.status === 401) {
authorizationService.saveUrl($location.path());
$location.path('/logon');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function (promise) {
return promise.then(success, error);
};
} ];
});
在登录控制器(成功登录时)中,我设置如下位置:
$location.path(authorizationService.getUrl());
这似乎是迄今为止我最好的解决方案,但是有一个缺点,我的应用程序必须等待API的401响应,然后才能重定向到登录页面。在我的应用程序的“帐户设置”页面上,在用户保存其设置之前,不会进行API调用,这意味着他们在未登录时将进入“帐户设置”屏幕。您始终可以在app.run()部分中使用$location.path(“/logon”)设置登录url,该url将在应用程序启动时运行。是的,但是,在检查用户是否实际登录时,如何仅显示某些路由的登录页面?您可以使用$location.path()检查路径并相应地执行操作。