有没有办法用angular-ui-routes而不是$ stateChangeStart进行用户身份验证?

时间:2016-05-05 09:03:09

标签: angularjs authentication angular-ui-router

我是Angular js&尝试使用Angular& amp;其余的API(codeigniter),但获得用户身份验证的东西。

我已经尝试了许多事情来实现它但到目前为止没有运气,我想根据用户角色使用angular-ui-routes设置我的路由并使用它进行用户身份验证。

现在我通过$stateChangeStart下每次调用rest API的服务检查用户身份验证,但是我要添加更多网址然后获取更多网址恐慌地把条件放进去。

所以我正在寻找一种可以设置用户身份验证和解决方案的解决方案。我的ui-routes下的用户角色。

我不确定此问题是否曾在此处提出,但我没有得到任何可靠的解决方案,请提出建议,如果有可能的话,那么我该如何实现?

1 个答案:

答案 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');
                });
            });
        }
});