AngularJS + Sails SPA中验证的常用做法

时间:2015-07-09 11:31:50

标签: angularjs authentication sails.js

我使用Sails和AngularJS制作单页应用程序。现在我正在尝试进行身份验证。

我在客户端有这个角度代码:

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/', {
            templateUrl:'pages/postList.html',
            controller:'PostListController'
        }).
        when('/createPost', {
            templateUrl:'pages/postCreation.html',
            controller:'PostCreationController'
        })
}])

此处所有 .html 文件都存储在 assets / 文件夹中,该文件夹是公开的。但我不希望公开访问 postCreation.html ,我想允许某些使用政策的用户访问此文件。

我想我可以将所有 .html 文件放在views文件夹中,为每个文件创建一个控制器方法,而不是使用策略。但我不确定这是一个很好的解决方案。

那么,如何在Sails + Angular SPA中使用策略?

1 个答案:

答案 0 :(得分:2)

您无法使用sails政策。相反,您可以使用resolve中的$routeProvider参数。

来自$routeProvider docs

  

应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将等待它们全部被解析或者在实例化控制器之前被拒绝。如果成功解决了所有promise,则会注入已解析的promise的值并触发$ routeChangeSuccess事件。如果任何promise被拒绝,则触发$ routeChangeError事件。

我在我的应用程序中配置了以下内容,其效果很好(使用$stateProvider,但该概念应该适用于$routeProvider):

.state('stateOnlyCertainUsersCanSee', {
  url: "/stateOnlyCertainUsersCanSee",
  templateUrl: "myTemplate.html",
  controller: 'myController',
  resolve: {
    validate: function($q, $sails, $state) {
      var defer = $q.defer();
      $sails.get("/me") // gets user info
          .then(
          function(response) {
            if (response.user.canAccessThisPage) { // Condition on which to pass or fail an user
              defer.resolve();
            }
            else {
              defer.reject("No access to page");
              $state.go("home"); // Redirect wherever you want
            }
          }
      );
      return defer.promise;
    }
  }
})