【问题标题】:Delaying template rendering for authentication check in Angular延迟模板渲染以在 Angular 中进行身份验证检查
【发布时间】:2015-03-25 11:53:52
【问题描述】:

如果您的静态 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,什么都没有。我不知道还能做什么,但这已经变得非常令人愤怒。

【问题讨论】:

  • 也许我没记错,但我认为该函数应该返回一个承诺。 (例如,将 return promise; 放在 $routeProvider 中登录函数的末尾)。
  • @mgilson 是的,就是 X_X
  • 哦,太好了。我没有足够的信心在不尝试的情况下将其作为答案:-)。我现在把它作为答案。

标签: angularjs angularjs-routing ngroute


【解决方案1】:

您传递给 $routeProvider 的函数应该返回一个承诺。例如:

$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 服务就是你兑现承诺的任何东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2018-06-07
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多