首页 文章

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

提问于
浏览
0

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

  • 检查每个路由上的loggedUser的角色(如果令牌或登录凭据在后端有效,则使用解析设置用户)

  • 重定向到预期路线

  • 如果不允许路由,则重定向到其他路由

在我的路线提供者中,我有类似的东西

$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,只能访问路径/ 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

这不是我所期望的,所以前三个日志都很好,第三个不等待承诺返回(所以我没有一个loggedUser)然后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);
  }
};

我做错了什么?为什么在执行其他代码之前,检查功能中的用户没有得到解决?

1 回答

  • 0

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

    现在是route resolve或run()块你可以检索用户auth对象执行授权操作 .

    例如

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

    }]);

相关问题