【发布时间】:2016-08-13 15:54:58
【问题描述】:
我一直在使用一个记录用户的应用程序。一旦用户登录,用户的信息就会存储在服务中,并且 cookie 会与身份验证令牌一起存储。 像这样:
angular
.module('MyModule')
.service('AuthService', service);
service.$inject = ['$cookieStore', '$resource'];
function service($cookieStore, $resource){
var self = this,
user = null;
self.loginResource = $resource('my_path_to_login_resource');
self.login = login;
self.getUser = getUser;
self.reloadUser = reloadUser;
function login(_userCredentials){
var userResource = new self.loginResource(_userCredentials);
return userResource.$save()
.then(setUser);
}
function setUser(_userResponse){
user = _userResponse.toJSON();
}
function getUser(){
return user;
}
function reloadUser(_token){
return self.loginResource()
.get(_token)
.then(setUser);
}
}
当我需要处理应用程序的路由时使用 ui-router 我这样做: 有角度的 .module('我的模块') .run(runFn);
runFn.$inject = ['$state', '$rootScope', 'AuthService', '$cookieStore'];
function runFn($state, $rootScope, AuthService, $cookieStore) {
$rootScope.$on('$stateChangeSuccess', stateTransitioned);
function stateTransitioned(e, toState, toParams, fromState, fromParams) {
var pageRealoaded = fromState.name? false : true;
if(AuthService.getUser()){
//DEALING WITH STATES TRANSITIONS
}
else{
if($cookieStore.get('auth_token') && pageRealoaded){
//ENSURE THAT THE USER IS LOGGED WHEN THE STATE IS CHANGED
AuthService.reloadUser.then(function(){
$state.go(toState.name);
})
.catch($state.go.bind(null,'login'));
//I DON'T KNOW HOW AVOID THAT THE STATE IS LOADED UNTIL THE USER
//HAVE BEEN LOGGED
}
else{
$state.go('login');
}
}
}
}
当页面重新加载时,使用存储的令牌,我尝试等待该用户已登录,然后,如果成功,则重定向到状态toState.name,如果错误,则重定向到登录。
我的问题:
1.如何避免在用户登录之前加载状态?
2。我处理这种情况的架构是否正确?对更好结构的建议?
【问题讨论】:
-
试试这个答案:stackoverflow.com/questions/22537311/… 它详细介绍了如何处理状态、登录、如何存储身份验证状态等。
标签: javascript angularjs cookies angular-ui-router reload