每次路由更改时,我都会检查是否使用当前记录的用户详细信息设置变量,如果未设置此变量,我只需重定向到登录页面。
现在我正在尝试实现某种“记住我”功能,所以每次路由更改时,如果变量用户不存在而不是重定向到登录页面,我会检查本地存储“ authtoken“,如果设置,我调用一个检查函数将authtoken传递给服务器,返回用户,应用程序的工作方式与手动登录后相同(返回与检查功能相同的用户)。
我很确定这不是最好的方法。
如果我重新加载页面,我首先运行检查功能,将authtoken发送到服务器并等待响应,如果用户存在将该值分配给rootscope中的变量。
我在根目镜中使用变量的服务不同,例如
angular.module('myApp')
.service('AdminService', function AdminService($rootScope, $http, StorageService) {
var authtoken = StorageService.get('authtoken');
var clientId = $rootScope.loggedUser.id;
当然,当检查函数运行时,它会等待响应,但服务正在实例化,并且$ rootScope.loggedUser.id不存在。
如何让应用程序等到检查功能收到响应?
这是我的代码
....
}).run(function($rootScope, $location, AuthService, StorageService) {
var intended = $location.path();
AuthService.check().success(function(data) {
if(data.user) {
$rootScope.loggedUser = data.user;
$location.path(intended);
} else $location.path('login');
});
$rootScope.$on('$routeChangeStart', function() {
if($rootScope.loggedUser) {
....
例如,如果用户为“myapp.com/#/admin/users”页面添加书签,我不想重定向到登录,如果我在本地存储中具有authtoken,但这会导致控制器成为实例化,使用该服务,需要尚未填充的$ rootScope.loggedUser.id。
我想只在页面(重新加载)加载时运行功能检查(不是每次用户更改路径时)。
答案 0 :(得分:1)
如果您需要服务电话来检查您的身份验证令牌,我建议您重新检查您的设计。验证令牌通常具有存储在其中的到期时间,因此您可以在不调用服务器的情况下检查您是否在有效期内。您不会危及安全性,因为auth令牌由服务器签名,并在您进行服务器调用以执行任何有用的操作时进行验证。因此,在正常情况下,不需要单独的check
电话。
但是,如果你坚持,这个用例最好用路由的resolve
属性来处理。但是,这意味着每个关心用户登录状态的路由都必须定义一个resolve属性。这并不意味着您必须在每次路线更改时调用该服务。
不是使用$rootScope.loggedUser
来存储用户,而是由AuthService
缓存并通过resolve
参数注入。
所以,您可以执行以下操作:
$routeProvider
.when("some/secure/route", {
controller: "SecureCtrl",
resolve: {
user: AuthService.checkUser
}
});
在您的AuthService中:
...
checkUser: function(){
var deferred = $q.defer();
if (cachedUser){
deferred.resolve(cachedUser);
} else {
AuthService.check().success(
function(data){
// cachedUseris defined at AuthService's scope
cachedUser = data.user;
deferred.resolve(data.user);
});
}
return deferred.promise;
}
然后,在您的控制器中:
.controller("SecureCtrl", function(user){
$scope.userId = user.id;
}