如何在AngularJS路由器中检查用户是否被认证

How to check if user is authenticated in AngularJS router?

本文关键字:用户 是否 认证 检查 AngularJS 路由器      更新时间:2023-09-26

我有一个使用Mean.js约曼生成器设置的应用程序。它使用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社区的新手,还在学习社区标准。

在高层次上,有两种方法:

  • 使用视图路由层(例如UI Router)捕获" unauthenticated "状态

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

在实际中,您可能会使用两者的组合。

对UI路由器来说,做这件事有两种方式:解析或事件。

Resolves: UI路由器提供了一个很好的特性,叫做Resolves,它允许你提供一个必须在视图呈现之前被解析的承诺。你可以创建一个promise来解析你的用户状态。

Events: UI路由器提供了一个$stateChangeStart事件,如果用户没有登录,你可以观察这个事件并阻止它。然后将用户发送到登录页面。这是一个更有状态的(你必须记住用户想要去的地方,所以你可以在登录后重定向)。

我在Stormpath Angular SDK中选择了事件方法,因为它给了我在身份验证之上定义授权的灵活性。

您可能正在寻找HTTP拦截器。检查请求是否正确。

从OneHungryMind:

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

有一些很好的教程(1)在那里(2)!