我有一个Angular(1.5)应用程序,带有我创建的身份验证服务(见下文)。
(function () {
"use strict";
angular
.module("app.core")
.service("mfAuth", mfAuth);
/** @ngInject */
function mfAuth(api, $rootScope, AUTH_EVENTS, $cookies) {
var currentUser = { userName: "" };
getSession();
var setRememberMe = function (rememberme, userId) {
if (rememberme && userId && userId > 0) {
var date = new Date();
date.setDate(date.getDate() + 30);
$cookies.put('remember_me', userId, { expires: date });
} else
$cookies.remove('remember_me');
};
function changeUser(user) {
var userProps = {
displayName: user.displayName,
...
};
angular.extend(currentUser, userProps);
}
function isLoggedIn(user) {
if (user === undefined) {
user = currentUser;
}
return user && user.userId > 0;
};
function getSession(force) {
var rememberme = $cookies.get('remember_me') !== undefined;
if (rememberme || force) {
var apiAuth = new api.Auth();
apiAuth.$getSession(
null,
function(response) {
if (response.result !== undefined) {
changeUser(response.result);
$rootScope.$broadcast(AUTH_EVENTS.isAuthenticated);
} else {
changeUser({});
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
},
function(response) {
changeUser({});
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
);
} else {
changeUser({});
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
};
function login(user, successCallback, errorCallback) {
var apiAuth = new api.Auth();
apiAuth.userName = user.userName;
apiAuth.password = user.password;
apiAuth.$login(
null,
function (response) {
getSession(true);
if (successCallback)
successCallback(response);
setRememberMe(user.rememberme, response.userId);
},
function (response) {
if (errorCallback)
errorCallback(response);
}
);
};
function logout(successCallback, errorCallback) {
var apiAuth = new api.Auth();
apiAuth.$logout(
null,
function (response) {
changeUser({});
if (successCallback)
successCallback();
setRememberMe(false, null);
$rootScope.$broadcast(AUTH_EVENTS.logoutSuccess);
},
function (response) {
if (errorCallback)
errorCallback(response);
}
);
}
return {
isLoggedIn: isLoggedIn,
login: login,
logout: logout,
user: currentUser
};
}
}());
我正在收听我的主runBlock上的广播......就这样......
(function () {
'use strict';
angular
.module('app.core')
.run(runBlock);
/** @ngInject */
function runBlock(msUtils, fuseGenerator, fuseConfig, $rootScope, AUTH_EVENTS, $state) {
$rootScope.$on(AUTH_EVENTS.notAuthenticated, function (ev, reason) {
if (!$state.is('app.auth_login')) {
event.preventDefault();
$state.go('app.auth_login');
}
});
$rootScope.$on(AUTH_EVENTS.isAuthenticated, function (ev, reason) {
if ($state.is('app.auth_login')) {
event.preventDefault();
$state.go('app.dashboard');
}
});
$rootScope.$on(AUTH_EVENTS.logoutSuccess, function (ev, reason) {
if (!$state.is('app.auth_login')) {
event.preventDefault();
$state.go('app.auth_login');
}
});
}
})();
当服务注入登录控制器时,一切都按预期工作 - 服务被实例化,getSession()函数触发,应用程序确定用户是否需要身份验证。
我的问题是我需要能够从运行块访问服务以获取某些授权功能,并且当我将mfAuth服务注入我的runBlock函数时,我发现AUTH_EVENTS.notAuthenticated被正确检测但是$ state .go方法不起作用,用户不会被重定向到登录状态。
我一直在读书,但找不到任何有关问题的提示。我已经尝试过监听ui-router的$ stateChangeError事件并且它没有被触发。我没有想法,所以我想转向堆栈溢出。我已经尝试在堆栈溢出时找到类似的问题,我确定答案已经存在,但我很难找到正确的关键字来找到问题。
任何人都可以提供帮助吗?
UPDATE 我刚刚在$ stateChangeStart上添加了以下日志记录...
$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
console.log("event: ", event);
console.log("toState: ", toState);
console.log("toParams: ", toParams);
console.log("fromState: ", fromState);
console.log("fromParams: ", fromParams);
});
这会产生以下控制台输出
event: Object {name: "$stateChangeStart", targetScope: Scope, defaultPrevented: false, currentScope: Scope} core.run.js:63
toState: Object {url: "/auth/login", views: Object, bodyClass: "login", name: "app.auth_login"} core.run.js:64
toParams: Object {} core.run.js:65
fromState: Object {name: "", url: "^", views: null, abstract: true} core.run.js:66
fromParams: Object {} core.run.js:62
event: Object {name: "$stateChangeStart", targetScope: Scope, defaultPrevented: false, currentScope: Scope} core.run.js:63
toState: Object {url: "/dashboard", views: Object, resolve: Object, name: "app.dashboard"} core.run.js:64
toParams: Object {} core.run.js:65
fromState: Object {name: "", url: "^", views: null, abstract: true} core.run.js:66
fromParams: Object {}
所以问题是服务的getSession正在触发并请求导航到登录状态之前的任何其他内容,例如($ urlRouterProvider.otherwise和输入到浏览器地址栏的url)。