在我走之前,我希望有人可以告訴我,如果我正確處理這種情況,或者如果有一種更容易的方式,我只是想念。我們有一個使用AngularJS和Web API製作的網頁。我們現在正在處理用戶在嘗試訪問某些頁面時的身份驗證。我們有一個叫做權限的模塊,我們目前使用這個模塊。AngularJS身份驗證
angular.module('permissions', []).factory('permissions', function (LoginApi, $q) {
//this is the variable which will hold the user, fetch it from the server - will return null if not authenticated
var storedUser;
function currentUser() {
var deferred = $q.defer();
if (!storedUser) {
storedUser = LoginApi.get(function() {
deferred.resolve(storedUser);
})
}
else {
deferred.resolve(storedUser);
}
return deferred.promise;
}
//define the permissions object that's exposed publicly
return {
setUser: function (user) {
storedUser = user;
},
isInRole: function (roleName) {
var promise = currentUser();
promise.then(function() {
if (!storedUser || !storedUser.roles) {
return false;
}
//if roleName is in currentUserRoles, then return true
if (storedUser.roles.indexOf(roleName) > -1) {
return true;
} else {
return false;
}
}, function(reason) {
return false;
});
},
isLoggedIn: function() {
var promise = currentUser();
promise.then(function() {
if (!storedUser) {
return false;
} else {
return true;
}
}, function(reason) {
return false;
});
},
firstName: function() {
var promise = currentUser();
promise.then(function() {
if (!storedUser) {
return '';
}
return storedUser.firstName;
}, function (reason) {
return '';
});
},
lastName: function() {
var promise = currentUser();
promise.then(function() {
if (!storedUser) {
return '';
}
return storedUser.lastName;
}, function (reason) {
return '';
});
},
email: function() {
var promise = currentUser();
promise.then(function() {
if (!storedUser) {
return '';
}
return storedUser.email;
}, function (reason) {
return '';
});
}
};
});
正如你可以看到我使用的承諾,使我的電話等我拿到用戶如果有一個已登錄。我有這個工作,但現在我的問題是,在任何功能上我的網站處理權限,看起來我需要添加承諾和延期,因爲目前的調用並沒有等待權限函數的運行。這是正在使用的地方的一個例子是在下面
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (next.access == "All")
{
//do nothing
}
else if (next.access == "User") {
if ($rootScope.permissions.isLoggedIn()) {
//do nothign they have permissions required
} else {
// not going to #login, we should redirect now
$location.path("/login");
}
}
else if (next.access == "Admin") {
if ($rootScope.permissions.isInRole('Admin_Base')) {
//do nothign they have valid permissions
} else {
// not going to #login, we should redirect now
$location.path("/403");
}
}
});
所以基本上,即使裏面的權限在我的職務推遲直到用戶得到返回顯示在rootScope我routeChange事件。調用這些函數的函數不會延遲,所以每次檢查權限時都會返回false。我想我可以通過向權限調用添加承諾來解決這個問題,但是我想知道是否有更簡單的方法來處理我缺少的這個問題。
我最終使用cookies來完成這項工作。我不喜歡它的唯一原因是它可以讓人們能夠篡改cookie,因爲他們然後會在用戶計算機上,但是我所做的是使用cookie,直到響應返回並且那麼響應會使用來自服務器的信息設置變量 –