我有一个使用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社区的新手,仍然在学习社区标准。
答案 0 :(得分:1)
在较高的层面上,有两种方法:
使用您的视图路由层(例如UI路由器)捕获“未经身份验证的”状态
使用HTTP拦截器查找状态为401 Unauthorized
的请求,指示用户必须登录(或当前会话已过期)
在实践中,你可能会使用两者的组合。
对UI路由器说,有两个这样做:解析或事件。
解析:UI路由器提供了一个很好的功能,称为resolve,它允许您提供必须在呈现视图之前解析的promise。您可以创建一个解决用户状态的承诺。
事件:UI路由器提供$stateChangeStart
事件,您可以观察此事件并在用户未登录时阻止它。然后您将用户发送到登录页面。这有点更有条理(您必须首先记住用户想要去的地方,以便您可以在登录后重定向)。
我为Stormpath Angular SDK上的工作选择了事件方法,因为它使我可以灵活地在身份验证之上定义授权。
答案 1 :(得分:0)
您可能正在寻找HTTP Interceptors。检查请求的身份验证。
HTTP拦截器是在一个地方定义行为的好方法 有关如何使用$ http处理所有呼叫的请求或响应 服务。当您想要设置身份验证令牌时,这是一个游戏改变者 所有拨出电话或响应特定的HTTP状态错误 系统级别。你可以将拦截器与非常有用的对 Angular Storage模块,用于缓存经过身份验证的用户并检索它 下一次运行时间。
有一些好tutorials(1) out there(2)!