路线解决承诺,未完全解决 - angularjs

时间:2014-11-07 13:07:29

标签: javascript angularjs angular-routing angular-promise

所以,我在这里尝试做的事情很简单:

  1. 检查每个路由上的loggedUser的角色(如果令牌或登录凭据在后端有效,则使用解析设置用户)
  2. 重定向到预期路线
  3. 如果不允许路由,则重定向到其他路由
  4. 在我的路线提供商中,我有类似

    的内容
    $routeProvider
      ...
      .when('/admin', {
        templateUrl: 'views/admin/dashboard.html',
        controller: 'AdminDashboardCtrl',
        resolve: {
          checkLoggedUser: check
        }
      })
      ...
    

    ckeck就是这个功能

    var check = function($rootScope, $q, AuthService) {
      var deferred = $q.defer();
    
      if($rootScope.loggedUser) {
        return;
      }
    
      console.log('inside resolve check')
    
      AuthService.check().success(function(data) {
        $rootScope.loggedUser = data.user;
        deferred.resolve(data.user);
      });
    
      console.log('finished check')
    
      return deferred.promise;
    };
    

    我的AuthService.check()就是这个函数

    check: function()
      {
        var authtoken = StorageService.get('authtoken');
        if(!authtoken) {
          $location.path('login');
        }
    
        console.log('before returning');
    
        return $http.post($rootScope.base + 'auth/authenticate', { 'authtoken': authtoken });
      },
    

    在我的.run中(我有功能

    $rootScope.$on('$routeChangeSuccess', function() {
      setIntendedUrl();
      console.log($rootScope.loggedUser);
      console.log($location.path());
    });
    

    和setIntendedUrl()检查loggedUser并重定向到正确的页面(或者,在我尝试完成的内容中,如果不允许,则重定向到其他页面,例如loggedUser的role = 1,can can只访问routes / admin,如果用户有role = 2,请求的路径是/ admin,则必须重定向到/ user)

    所以在完成所有这些代码之后,当应用程序运行时,这是我在控制台中的日志(请参阅代码在哪里调用)

    inside resolve check app.js:29
    before returning authservice.js:24
    finished check app.js:36
    intended: /admin/agents/create app.js:149 <--- here is where I redirect the user
    Object {id: "21", name: "Kyle", surname: "Butler", roleId: "2"...} app.js:167
    /admin/agents/create <--- requested path
    

    这不是我所期待的,所以前三个日志都很好,第三个不等待承诺返回(所以我没有登录用户)然后是AuthService:check( )返回用户并且此时已完成所有操作,具有role = 2的用户处于不允许查看的路径中。

    只是为了完成代码,这是setIntendedUrl函数

    var setIntendedUrl = function() {
      intended = $location.path();
      console.log('intended: ' + intended)
      if(intended !== '/login') {
        if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '1' &&  !/^\/admin*/.test(intended)) {
          intended = '/admin';
        } else if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '2' &&  !/^\/manager*/.test(intended)) {
          intended = '/manager';
        }
        StorageService.set('intended', intended);
        //$location.path(intended);
      }
    };
    

    我做错了什么?为什么在执行其他代码之前未解析check函数中的用户?

1 个答案:

答案 0 :(得分:0)

您是否可以使用会话/本地存储或$ rootScope,您可以在用户登录时使用给定路径,权限信息存储用户授权对象。

现在是路由解析或run()块,您可以检索用户身份验证对象执行授权操作。

e.g。

.run(['sessionService', '$rootScope', '$location', function(sessionService, $rootScope, $location) {
$rootScope.$on( "$routeChangeStart", function(event, next, current) {
    var currentUser = sessionService.get('user_details');

    if(next.taskAccess && next.taskAccess != ""){
        var hasPerm = $rootScope.getPermission(next.taskAccess);
        if(!hasPerm){
             $location.path('/unauthorized');
        }
    }
});

}]);