Angularjs 角度用户界面路由器用户身份验证检查

Angularjs 角度用户界面路由器用户身份验证检查,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我正在尝试使用ui路由器创建一个非常简单的身份验证控件。我在后端进行检查,但是,如果用户没有登录,我想重定向他们 然而,当我尝试访问/配置文件时,什么都没有发生。如果我在console.log()中输入类似“yes”的文本,它将被无限时间注销,直到我得到堆栈大小超出错误。它不断点击/authcheck url,我可以通过Chrome的网络工具看到这一点 如果我删除$state.go(toState.name),我会看到一个空白页面,console.log()显示用户已登录(我是),但我无法看到预

我正在尝试使用ui路由器创建一个非常简单的身份验证控件。我在后端进行检查,但是,如果用户没有登录,我想重定向他们

然而,当我尝试访问/配置文件时,什么都没有发生。如果我在console.log()中输入类似“yes”的文本,它将被无限时间注销,直到我得到堆栈大小超出错误。它不断点击/authcheck url,我可以通过Chrome的网络工具看到这一点

如果我删除
$state.go(toState.name)
,我会看到一个空白页面,
console.log()
显示用户已登录(我是),但我无法看到预期的
/profile
页面

这里有什么问题

/authcheck
返回
200
403

我的工厂

angular.module('site.profile').factory('Profile', ["$http", function($http) {
  return {
    authCheck: function() {
      return $http.get('/authcheck');
    }
  };
}]);
用户界面路由器

angular.module('site.profile.routes')
.run(
  ['$rootScope', 'Profile', '$state', '$stateParams',
    function($rootScope, Profile, $state, $stateParams) {
      $rootScope.$state = $state;
      $rootScope.$stateParams = $stateParams;
      $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
        if (toState.name !== 'auth') {
          event.preventDefault();
          Profile.authCheck().then(function(returned) {
            if (returned.status === 200) {
              console.log("yes!");
              console.log(toState.name);
              //$state.go($state);
            } else {
              $state.go('auth');
            }
          });
        }
      });
    }
  ]
)


.config(
  ['$stateProvider', '$urlRouterProvider', '$locationProvider',
    function($stateProvider, $urlRouterProvider, $locationProvider) {

      $locationProvider.html5Mode({
        enabled: true,
        requireBase: false
      });

      $stateProvider
        .state('profile', {
          url: '/profile',
          views: {
            '': {
              templateUrl: 'views/profile/profile.html'
            },
            'post@profile': {
              templateUrl: 'views/post.html'
            },
            'nav@profile': {
              templateUrl: 'views/shared/nav/nav.html'
            },
            'top@profile': {
              templateUrl: 'views/profile/top.html'
            }
          }
        })
        .state('auth', {
          url: '/signin',
          template: "please sign in"
        });
    }
  ]);

您正在阻止除
auth
之外的每个状态更改的默认值

您需要一种在用户获得授权后存储用户的方法,这样您就不需要每次都发出新请求,然后可以在阻止更改之前检查该用户对象是否存在

我个人更喜欢在顶级父级状态下使用
解析
,因此只需在父级上检查一次授权。然后所有子状态将被阻止,直到父状态被解析