AngularJS:阻止用户访问某个状态

时间:2015-03-06 16:01:40

标签: javascript angularjs node.js sails.js

我正在使用sails.js后端和前端角度来构建应用。我试图阻止用户访问管理控制页面,如果他没有被授权。我已经遇到了几个答案,但它们似乎都没有完全发挥作用。

在我的app.js中,我有

$stateProvider
.state('home', {
  url: "/home",
  templateUrl: "home/homeTemplate.html",
  controller: 'homeController'
})
.state('adminPage', {
  url: "/adminPage",
  templateUrl: "adminPage/adminTemplate.html",
  controller: 'adminPageController',
  resolve: {
    validate: function($q, $sails, $location) {
      var defer = $q.defer();
      $sails.get("/user/getCurrentUser")
          .success(function(response) {
            if (response.user.accessAdminPage) {
              defer.resolve();
            }
            else {
              defer.reject("Access blocked");
              $location.path('/');
            }
            return defer.promise;
          })
    }
  }
})

目前的代码部分有效;目前的问题是,当未经授权的用户首次登录并登陆主页,然后访问localhost:1337/#/adminPage时,他实际上到达了该页面。地址栏中的网址更改为localhost:1337/#/home,但未重定向用户。现在奇怪的是,当之后通过导航栏访问主页并尝试再次访问管理页面时,用户被重定向到主页(尽管在重新加载页面时会出现恼人的'闪存')。 / p>

对于其他人的询问,这种处理方式有效,我想知道我可能错过了什么,以及为什么我目前的解决方案无效的原因。

2 个答案:

答案 0 :(得分:1)

您将从成功函数返回承诺,这将永远不会有效。 您应该从外部成功函数返回defered.promise(promise对象)。

<强> CODE

$stateProvider
.state('home', {
        url: "/home",
        templateUrl: "home/homeTemplate.html",
        controller: 'homeController'
    })
.state('adminPage', {
  url: "/adminPage",
  templateUrl: "adminPage/adminTemplate.html",
  controller: 'adminPageController',
  resolve: {
    validate: function($q, $sails, $location) {
      var defer = $q.defer();
      $sails.get("/user/getCurrentUser")
      .success(function(response) {
        if (response.user.accessAdminPage) {
          defer.resolve();
        } else {
          defer.reject("Access blocked");
          $location.path('/');
        }

      });
      return defer.promise;
    }
  }
});

希望这可以帮助你,谢谢。

答案 1 :(得分:0)

使用pankajparkar给出的解决方案,问题是您必须回复每个州声明中的逻辑。我建议您在onStateChangeStart活动

中查看用户的授权
angular.module('myApp', ['ui.router'])
  .run(function($rootScope, AuthService){
    $rootScope.$on('$stateChangeStart', 
      function(event, next, nextParams, prev, prevParams) {
        AuthService.isNotAutorized()
          .then(function() {
            event.preventDefault(); 
            $state.go('defaultState');
          });
    });
  });