在User.login()和User.getCurrent()Angular SDK中包含角色

Tom*_*lam 3 angularjs loopbackjs

我目前正在使用Loopback Angular SDK编写管理界面.在挖掘了文档和代码之后,我仍然没有明白如何在响应中包含用户的角色.它让我在前端遇到了真正的麻烦,因为我还没有足够的经验与Angular一起弄清楚如何对我的每个状态强制执行角色检查(我正在使用UI-Router).

客户端:/auth.js

        // Log the user in
        $scope.doAuth = function() {

            $scope.hasError = false;
            $scope.busy = true;

            $scope.loginResult = User.login({include: 'roles'}, $scope.credentials,

                function wasSuccessfulAuth(authResponse) {

                    $scope.busy = true;

                    $rootScope.isAuthenticated = true;
                    $rootScope.user = authResponse.user;

                    $location.path('dashboard');

                },

                function wasFailedAuth(authResponse) {

                    $timeout(function() {

                        $scope.hasError = true;
                        $scope.authError = authResponse.data.error.message || 'Unknown error';
                        $scope.busy = false;

                    }, 1000);

                }

            )
        }
Run Code Online (Sandbox Code Playgroud)

服务器:/common/models/user.json

{
  "name": "user",
  "plural": "Users",
  "base": "User",
  "properties": {

  },
  "relations": {
    "roles": {
      "type": "belongsTo",
      "model": "RoleMapping",
      "foreignKey": "principalId"
    }
  },
  "acls": [],
  "methods": []
}
Run Code Online (Sandbox Code Playgroud)

所以这适用于API资源管理器,我有一个我希望与一个有关系的对象的路由,但我似乎无法得到更多...返回的所有内容都是标准用户登录的东西( id,accessToken,email等)当我走到这一步时,文档似乎很冷,但我认为这将是一个常见的用例?

这对我来说有点显而易见.

Ste*_*erg 6

使用LoopBack解决这个问题实际上非常容易:这就是" 模型范围 "非常方便的地方 - 包括我认为对这种情况非常有用的默认范围.

首先,简要说明模型范围:

模型范围类似于已保存的查询或"视图",允许您filter为该范围的任何查询指定内置.例如,如果将默认范围设置为有效过滤器,则针对模型的每个查询(任何类型)都将应用此过滤器!

这可能会让你遇到麻烦,但是有一个用例是非常安全的(所有其他条件相同)并且实际上完全解决了你的问题:当我说一个范围让你给出一个有效的filter,结果是过滤器不是刚where条款,而且include,limit

因此,要解决您的问题,您只需要在User模型上使用默认范围include即可.对于你的例子:

只需将一个scope对象添加到common/models/user.json:

{
  "name": "user",
  "plural": "Users",
  "base": "User",
  "scope": {
    "include": [
      "roles"
    ]
  },
  "properties": {

  },
  "relations": {
    "roles": {
      "type": "belongsTo",
      "model": "RoleMapping",
      "foreignKey": "principalId"
    }
  },
  "acls": [],
  "methods": []
}
Run Code Online (Sandbox Code Playgroud)

通过添加带有"include"的默认范围,LoopBack将根据命名关系自动嵌入相关模型的对象(就像在查询中添加它一样 - 如上所述,这是不可能的,或者至少不容易,在这种情况下).

有一点需要注意:因为RoleRoleMapping是内置的模型,并肯定标记为非公开,我实际上并不知道你是否可以直接包含它们(但出于不同的原因,而不是以上).我还没有完成ACL的工作(但是),但可能围绕访问控制更加复杂,特别是在相关模型中.

所以,10:11我的示例代码上面解释的机制做的include这里,政策担忧可能会减慢你的速度(我很好奇,想知道如果他们这样做).

但是,我想你可以添加一个RoleMapping你公开的派生模型(就像你为用户做的那样),并在任何地方使用它(包括与之关系user) - 希望这是明确的(让我知道,如果没有).

总结:如果你default scope为你的派生user模型添加一个,为你做的include话,AngularJS服务包装器(由...构建lb-ng)将更加明智(include所有这些都发生在后端):

$scope.loginResult = User.login($scope.credentials,
  function wasSuccessfulAuth(authResponse) {
    console.log('Related models are here: ', authResponse.roles,
                authResponse.user);
    ...
Run Code Online (Sandbox Code Playgroud)

换句话说,生成的模型将包含一个数组,.roles[]包含该用户的相关角色(基于您的关系定义),以及.user整个user模型就在那里!

后一点尚不清楚,但我对此很有信心,因为我完全按照上述方法做了,但我知道有不同的相关模型可行.令我惊讶的是,user也被包括在内,因为LoopBack $resource包装器(由创建的包装器)明确请求lb-ng.所以,事实上,你没有做一个单独的查询来获得它user- 它已经存在!在使用$service包装器时,我看到没有API ,以获得内置include并更改它; 我猜这就是上面评论中发布的内容.

希望这是有帮助的.

史蒂夫