我是Angular js&尝试使用Angular& amp;其余的API(codeigniter),但获得用户身份验证的东西。
我已经尝试了许多事情来实现它但到目前为止没有运气,我想根据用户角色使用angular-ui-routes
设置我的路由并使用它进行用户身份验证。
现在我通过$stateChangeStart
下每次调用rest API的服务检查用户身份验证,但是我要添加更多网址然后获取更多网址恐慌地把条件放进去。
所以我正在寻找一种可以设置用户身份验证和解决方案的解决方案。我的ui-routes
下的用户角色。
我不确定此问题是否曾在此处提出,但我没有得到任何可靠的解决方案,请提出建议,如果有可能的话,那么我该如何实现?
答案 0 :(得分:0)
您应该查看resolve
。
基本上你可以这样做:
//You can inject any service here.
//Return a promise to be resolved or an ordinary object
function tryAuth($state, Auth){
return Auth.currentUser()
//In this case currentUser() will return a promise containing an instance
//of the user if it exists or call $http to try to authenticate the user from
//saved credentials.
.catch(function(){
//If the promise rejects for any reason, move to a different state.
$state.go('login'); //This is just an example
});
}
$stateProvider
.state('login', {
url: '/login',
templateUrl 'partials/login.html',
controller: 'loginCtrl'
})
.state('profile', {
url: '/profile',
templateUrl: 'partials/profile.html',
controller: 'profileCtrl',
resolve: {
//In the controller you can inject user to recieve the actual user
user: tryAuth
}
});
这可以通过多种方式进行重构,但你明白了。
我过去使用的另一种解决方案与此类似:
//In config clause
$stateProvider
.state('login', {
url: '/login',
templateUrl 'partials/login.html',
controller: 'loginCtrl'
})
.state('profile', {
url: '/profile',
templateUrl: 'partials/profile.html',
controller: 'profileCtrl',
requireLogin: true
});
//In run clause
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
console.log('Moving to state: ' + toState.name + ' from state: ' + fromState.name);
/* Require users to login to certain sections */
if (toState.requireLogin && !Auth.currentUser) {
event.preventDefault();
Auth.reAuthenticate().then(function () {
//Complete the transition after authentication
$state.go(toState, toParams);
}).catch(function () {
loginModal().then(function () {
//Complete the transition after authentication
$state.go(toState, toParams);
}).catch(function () {
//If the state is not abstract
if (!fromState.abstract)
//Go back to the state you came from
return $state.go(fromState, fromParams);
$state.go('default');
});
});
}
});