如何检查用户是否在AngularJS路由器中进行了身份验证?

时间:2015-05-27 16:54:33

标签: javascript angularjs authentication express

我有一个使用Mean.js yeoman生成器设置的应用程序。它使用PassportJS来设置本地身份验证。这一切都很好,我了解如何检查用户是否从ExpressJS路由文件登录。
问题是我的大多数页面路由都是在角度路由中完成的。我知道如何使用以下代码检查控制器中的身份验证。

// Projects controller
angular.module('projects').controller('ProjectsController', ['$scope', '$stateParams', '$location', 'Authentication', 'Projects',
    function($scope, $stateParams, $location, Authentication, Projects) {
        $scope.authentication = Authentication;

但是如何检查路由中的身份验证。例如,在此路由文件中,我如何仅允许经过身份验证的用户访问工具html文件并将未登录的用户重定向回主页:

'use strict';

//Setting up route
angular.module('analysis').config(['$stateProvider',
    function($stateProvider) {
        // Projects state routing
        $stateProvider.
        state('imageAnalysis', {
            url: '/analysis',
            templateUrl: 'modules/analysis/views/tools.client.view.html'
        });
    }
]);

我知道那里有类似的帖子,但我很难理解其中的许多帖子。谢谢,我真的很感激任何帮助。我是stackoverflow社区的新手,仍然在学习社区标准。

2 个答案:

答案 0 :(得分:1)

在较高的层面上,有两种方法:

  • 使用您的视图路由层(例如UI路由器)捕获“未经身份验证的”状态

  • 使用HTTP拦截器查找状态为401 Unauthorized的请求,指示用户必须登录(或当前会话已过期)

在实践中,你可能会使用两者的组合。

对UI路由器说,有两个这样做:解析或事件。

解析:UI路由器提供了一个很好的功能,称为resolve,它允许您提供必须在呈现视图之前解析的promise。您可以创建一个解决用户状态的承诺。

事件:UI路由器提供$stateChangeStart事件,您可以观察此事件并在用户未登录时阻止它。然后您将用户发送到登录页面。这有点更有条理(您必须首先记住用户想要去的地方,以便您可以在登录后重定向)。

我为Stormpath Angular SDK上的工作选择了事件方法,因为它使我可以灵活地在身份验证之上定义授权。

答案 1 :(得分:0)

您可能正在寻找HTTP Interceptors。检查请求的身份验证。

来自OneHungryMind

  

HTTP拦截器是在一个地方定义行为的好方法   有关如何使用$ http处理所有呼叫的请求或响应   服务。当您想要设置身份验证令牌时,这是一个游戏改变者   所有拨出电话或响应特定的HTTP状态错误   系统级别。你可以将拦截器与非常有用的对   Angular Storage模块,用于缓存经过身份验证的用户并检索它   下一次运行时间。

有一些好tutorials(1) out there(2)