我正在尝试使用AngularUI路由器进行一些身份验证。 $urlRouter.sync()
看起来就像我需要的那样。但是,只有在我拦截$locationChangeSuccess
时才可以使用。但是当我这样做时,$state.current.name
是空的,而我希望它是当前的状态。
到目前为止,这是我的代码:
$rootScope.$on('$locationChangeSuccess', function(event, next, nextParams) {
event.preventDefault();
if ($state.current.name === 'login') {
return userService.isAuthenticated().then(function(response) {
var authenticated;
authenticated = response.authenticated;
return alert(authenticated);
});
}
});
关于我做错了什么的指示?
答案 0 :(得分:34)
我建议更多地使用“UI-Router
方式”。我们应该使用$rootScope.$on('$stateChangeStart'
事件,其中$state.current
将被正确提供。这是a working example
让我们观察一下简单的(但不是天真的)解决方案,它可以在以后扩展到任何程度。此外,如果您想要这种方法,这里有更全面的实施:angular ui-router login authentication
首先,让我们的用户服务定义如下:
.factory('userService', function ($timeout, $q) {
var user = undefined;
return {
// async way how to load user from Server API
getAuthObject: function () {
var deferred = $q.defer();
// later we can use this quick way -
// - once user is already loaded
if (user) {
return $q.when(user);
}
// server fake call, in action would be $http
$timeout(function () {
// server returned UN authenticated user
user = {isAuthenticated: false };
// here resolved after 500ms
deferred.resolve(user)
}, 500)
return deferred.promise;
},
// sync, quick way how to check IS authenticated...
isAuthenticated: function () {
return user !== undefined
&& user.isAuthenticated;
}
};
})
因此,我们使用async (此处为$timeout
)从服务器加载 user
对象。在我们的示例中,它将具有属性{isAuthenticated: false }
,该属性将用于检查是否经过身份验证。
还有同步方法isAuthenticated()
,在加载和允许用户之前,它始终返回false
。
那将是我们'$stateChangeStart'
事件的听众:
.run(['$rootScope', '$state', 'userService',
function ($rootScope, $state, userService) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams
, fromState, fromParams) {
// if already authenticated...
var isAuthenticated = userService.isAuthenticated();
// any public action is allowed
var isPublicAction = angular.isObject(toState.data)
&& toState.data.isPublic === true;
if (isPublicAction || isAuthenticated) {
return;
}
// stop state change
event.preventDefault();
// async load user
userService
.getAuthObject()
.then(function (user) {
var isAuthenticated = user.isAuthenticated === true;
if (isAuthenticated) {
// let's continue, use is allowed
$state.go(toState, toParams)
return;
}
// log on / sign in...
$state.go("login");
})
...
我们首先检查的是,用户是否已加载并经过身份验证(var isAuthenticated = ...
)。接下来,我们将为任何公共方法赋予绿色。这是通过状态对象定义的data {}
属性完成的(请参阅Attach Custom Data to State Objects)
就是这样。如果状态定义如下面的代码段,我们可以体验:
'public'
,'home'
'private'
,'private'
会重定向登录,如果isAuthenticated === false
此示例中的'login'
提供了如何开启/关闭isAuthenticated的快速方法
// States
$stateProvider
// public
.state('home', {
url: "/home",
templateUrl: 'tpl.html',
data: { isPublic: true },
})
.state('public', {
url: "/public",
templateUrl: 'tpl.html',
data: { isPublic: true },
})
// private
.state('private', {
url: "/private",
templateUrl: 'tpl.html',
})
.state('private2', {
url: "/private2",
templateUrl: 'tpl.html',
})
// login
.state('login', {
url: "/login",
templateUrl: 'tpl.html',
data: { isPublic: true },
controller: 'loginCtrl',
})
检查所有here
其他一些资源: