Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在AngularJS应用程序中通过身份验证保护路由_Javascript_Angularjs_Authentication - Fatal编程技术网

Javascript 在AngularJS应用程序中通过身份验证保护路由

Javascript 在AngularJS应用程序中通过身份验证保护路由,javascript,angularjs,authentication,Javascript,Angularjs,Authentication,我的一些AngularJS路由指向需要使用我的API对用户进行身份验证的页面。在这些情况下,我希望将用户重定向到登录页面,以便他们能够进行身份验证。例如,如果客户访问/account/settings,则应将其重定向到登录表单 从头脑风暴中,我想到了监听$locationChangeStart事件,如果是需要验证的位置,则将用户重定向到登录表单。我可以在我的应用程序run()event: .run(['$rootScope', function($rootScope) { $rootSc

我的一些AngularJS路由指向需要使用我的API对用户进行身份验证的页面。在这些情况下,我希望将用户重定向到登录页面,以便他们能够进行身份验证。例如,如果客户访问
/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()检查路径并相应地执行操作。