在Angular中延迟模板呈现以进行身份​​验证检查

时间:2015-01-26 23:36:25

标签: angularjs angularjs-routing ngroute

如果您的静态URL导致内容与身份验证方案一起使用,则Angular可能会导致严重的安全问题。如果未注册的用户访问该页面,则内容将在屏幕上闪烁一会儿,然后重定向到安全位置。我发现了这个问题,进行了广泛的搜索,并在$ routeConfig中找到了resolve属性。不幸的是,无论我做什么,它都行不通。代码如下:

$routeProvider.when('/dashboard/:id', {
    templateUrl: 'js/partials/dashboard.html', 
    controller:'DashCtrl',
    access: access.user,
    resolve: {
      login: function(authService) {
        var promise = authService.isLoggedIn();
        promise.then(function(data){
        // We're in successfully 
        }).catch(function(err){
            // ew, go away, redirect to login page
            window.location = "login";
        });
      }
    }
});

AuthService.isLoggedIn()看起来像:

isLoggedin : function() {
        return $http.get("users/session_check").then(function(result) {
            if (result.data) {
              if (user == undefined)
              {
                placeholderService.populatePlaceholders();
                user = result.data;
              }
              return result.data;
            } else {
              return $q.reject("Please log in.");
            }
          });
    }

无论如何,视图都会闪烁。我在页面上有ng-cloaks,没有。我不知道还能做什么,但这已经变成了彻头彻尾的真气。

1 个答案:

答案 0 :(得分:1)

传递给$ routeProvider的函数应该返回一个承诺。 e.g:

$routeProvider.when('/dashboard/:id', {
    templateUrl: 'js/partials/dashboard.html', 
    controller:'DashCtrl',
    access: access.user,
    resolve: {
      login: function(authService) {
        var promise = authService.isLoggedIn();
        return promise.then(function(data){
            // We're in successfully
            return data;  // This gets injected as "login"
        }).catch(function(err){
            // ew, go away, redirect to login page
            window.location = "login";
        });
      }
    }
});

而且,如果我没记错的话,承诺被赋予的价值最终会作为服务注入控制器(在这种情况下,login服务就是你履行承诺的任何事情)