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等)当我走到这一步时,文档似乎很冷,但我认为这将是一个常见的用例?
这对我来说有点显而易见.
使用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将根据命名关系自动嵌入相关模型的对象(就像在查询中添加它一样 - 如上所述,这是不可能的,或者至少不容易,在这种情况下).
有一点需要注意:因为Role和RoleMapping是内置的模型,并肯定标记为非公开,我实际上并不知道你是否可以直接包含它们(但出于不同的原因,而不是以上).我还没有完成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并更改它; 我猜这就是上面评论中发布的内容.
希望这是有帮助的.
史蒂夫
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |