角度防止状态改变用户不登录

时间:2016-10-25 11:06:54

标签: angularjs authentication

如果用户没有登录我想阻止状态变化。我使用下面的代码并且工作正常。

angular.module('app', [...])
       .config(function(){})
       .run(function($rootscope,$auth,$state){

       $rootScope.$on("$stateChangeStart", function(event){
        var user = $auth.getToken();
        if (user === null){
            // User isn’t authenticated
            $state.transitionTo("index");
            event.preventDefault();
         }
        });

       })

但显示此错误!

angular.js:12783 RangeError: Maximum call stack size exceeded
at Array.indexOf (native)
at indexOf (http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:87:18)
at http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:1708:46
at forEach (http://localhost:9000/bower_components/angular/angular.js:341:20)
at http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:1707:9
at forEach (http://localhost:9000/bower_components/angular/angular.js:341:20)
at Object.$$keys (http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:1706:7)
at Object.$$validate [as $$validates] (http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:1729:23)
at Object.transitionTo (http://localhost:9000/bower_components/angular-ui-router/release/angular-ui-router.js:3184:27)
at http://localhost:9000/scripts/app.js:114:24

任何人都可以帮助我?

2 个答案:

答案 0 :(得分:1)

您的stateChangeStart函数会创建一个循环,这就是您收到错误的原因。考虑一下:

  1. 状态变化开始
  2. 用户未经过身份验证
  3. 国家去'索引'
  4. 状态变化开始
  5. 用户未经过身份验证
  6. 国家去'索引'
  7. 您可以尝试使用某个变量作为仅针对经过身份验证的用户的状态,例如:

      $rootScope.$on("$stateChangeStart", function(event, toState){
        if (toState.auth) {
          var user = $auth.getToken();
    
          if (!user) {
            // User isn’t authenticated
            event.preventDefault();
            $state.transitionTo("index");
         }
        }
      });
    

答案 1 :(得分:0)

你可以试试这个吗?让我知道。

angular.module('app', [...])
       .config(function(){})
       .run(function($rootscope,$auth,$state){

       $rootScope.$on("$stateChangeStart", function(event){
        var user = $auth.getToken();
        if (user === undefined){
            // User isn’t authenticated
            $state.transitionTo("index");
            event.preventDefault();
         }
        });

       })