在 emberjs 中管理用户角色?
Managing user roles in emberjs?
我有一个nodejs api如下图
route.post("/token",function(req,res){
authLib
.checkForm(req.body)
.then(authLib.findUser)
.then(authLib.isValidUser)
.then(authLib.authenticate)
.then(authLib.genToken)
.then((token)=>{
res
.status(200)
.json({'access_token': token});
})
.catch((err)=>{
res
.status(400)
.json({'error': err.message});
});
});
用户的 model
包含具有用户角色的字段。每个用户角色都有不同的仪表板。
我已经使用 oauth2-password-grant
实现了 ember-simple-auth,仪表板模板如下所示
{{#if session.isAuthenticated}}
{{#app-dashboard}}
{{/app-dashboard}}
{{else}}
{{#landing-app}}
{{/landing-app}}
{{/if}}
问题是如何区分用户角色。一种方法可能是使用 ajax 请求来获取角色,但这意味着对所有视图的额外 XHR 请求。
在 Ember.$
中使用 XHR 的另一个问题是授权令牌未附加到请求。解决此问题的最佳方法是什么?
我没有使用过 ember-simple-auth,但一种可能有用的方法是发送角色/权限 object 以及成功用户 "login" 的令牌。然后创建一个 'user-permissions' Ember 服务,存储角色/权限 object 并且可以在需要时检查用户是否具有某种权限。我将使用数组作为示例权限 object。您应该能够通过单个 XHR 请求执行此操作。
当然,任何 client-side "security" 本质上都是不安全的,因此请确保保护您的路由免受 server-side.
上的用户行为的影响
首先,您需要在数据库中具有与用户相关联的一些角色或权限。然后将一些逻辑添加到您的节点 API 到 return 经过身份验证的用户的权限列表以及该令牌。
然后,在Ember中定义一个权限服务,如下所示:
export default Ember.Service.extend({
permissions: [], // Sample permissions: "seeAdminPanel", "deleteUsers"
// You can create a computed property to check permissions (good for templates)
canDeleteUsers: Ember.computed('permissions', function() {
//Check that the permissions object contains the deleteUsers permission
let permissions = this.get('permissions');
let permissionToCheck = 'deleteUsers';
let userHasPermission = permissions.indexOf(permissionToCheck) > -1;
return (userHasPermission);
}),
// Or create a generic function to check any permission (good for checking in a function)
canCurrentUser(permissionToCheck) {
let permissions = this.get('permissions');
return (permissions.indexOf(permissionToCheck) > -1);
}
});
当您的 Ember 应用访问您的节点 api 时,它将在成功响应中获得权限 object。在成功回调中像这样在权限服务上设置 object(记得注入您的服务):
let userPermissionsService = this.get('userPermissionsService');
userPermissionsService.set('permissions', ["deleteUsers"]);
然后在模板中使用:
{{#if userPermissionsService.canDeleteUsers}}
<button>Delete User</button>
{{/if}}
或在函数中使用:
let userPermissionsService = this.get('userPermissionsService');
if (userPermissionsService.canCurrentUser("deleteUsers")) {
this.deleteUser()
}
就使用 XHR 请求传回授权令牌而言,您应该能够使用常规 jquery ajax 请求(设置 headers object 在请求中根据 http://api.jquery.com/jQuery.ajax/) or if you want to attach it to every Ember data request, customizing the REST adapter should work: https://guides.emberjs.com/v2.13.0/models/customizing-adapters/#toc_headers-customization
要检查权限,请考虑使用 Ember-Can
我有一个nodejs api如下图
route.post("/token",function(req,res){
authLib
.checkForm(req.body)
.then(authLib.findUser)
.then(authLib.isValidUser)
.then(authLib.authenticate)
.then(authLib.genToken)
.then((token)=>{
res
.status(200)
.json({'access_token': token});
})
.catch((err)=>{
res
.status(400)
.json({'error': err.message});
});
});
用户的 model
包含具有用户角色的字段。每个用户角色都有不同的仪表板。
我已经使用 oauth2-password-grant
实现了 ember-simple-auth,仪表板模板如下所示
{{#if session.isAuthenticated}}
{{#app-dashboard}}
{{/app-dashboard}}
{{else}}
{{#landing-app}}
{{/landing-app}}
{{/if}}
问题是如何区分用户角色。一种方法可能是使用 ajax 请求来获取角色,但这意味着对所有视图的额外 XHR 请求。
在 Ember.$
中使用 XHR 的另一个问题是授权令牌未附加到请求。解决此问题的最佳方法是什么?
我没有使用过 ember-simple-auth,但一种可能有用的方法是发送角色/权限 object 以及成功用户 "login" 的令牌。然后创建一个 'user-permissions' Ember 服务,存储角色/权限 object 并且可以在需要时检查用户是否具有某种权限。我将使用数组作为示例权限 object。您应该能够通过单个 XHR 请求执行此操作。
当然,任何 client-side "security" 本质上都是不安全的,因此请确保保护您的路由免受 server-side.
上的用户行为的影响首先,您需要在数据库中具有与用户相关联的一些角色或权限。然后将一些逻辑添加到您的节点 API 到 return 经过身份验证的用户的权限列表以及该令牌。
然后,在Ember中定义一个权限服务,如下所示:
export default Ember.Service.extend({
permissions: [], // Sample permissions: "seeAdminPanel", "deleteUsers"
// You can create a computed property to check permissions (good for templates)
canDeleteUsers: Ember.computed('permissions', function() {
//Check that the permissions object contains the deleteUsers permission
let permissions = this.get('permissions');
let permissionToCheck = 'deleteUsers';
let userHasPermission = permissions.indexOf(permissionToCheck) > -1;
return (userHasPermission);
}),
// Or create a generic function to check any permission (good for checking in a function)
canCurrentUser(permissionToCheck) {
let permissions = this.get('permissions');
return (permissions.indexOf(permissionToCheck) > -1);
}
});
当您的 Ember 应用访问您的节点 api 时,它将在成功响应中获得权限 object。在成功回调中像这样在权限服务上设置 object(记得注入您的服务):
let userPermissionsService = this.get('userPermissionsService');
userPermissionsService.set('permissions', ["deleteUsers"]);
然后在模板中使用:
{{#if userPermissionsService.canDeleteUsers}}
<button>Delete User</button>
{{/if}}
或在函数中使用:
let userPermissionsService = this.get('userPermissionsService');
if (userPermissionsService.canCurrentUser("deleteUsers")) {
this.deleteUser()
}
就使用 XHR 请求传回授权令牌而言,您应该能够使用常规 jquery ajax 请求(设置 headers object 在请求中根据 http://api.jquery.com/jQuery.ajax/) or if you want to attach it to every Ember data request, customizing the REST adapter should work: https://guides.emberjs.com/v2.13.0/models/customizing-adapters/#toc_headers-customization
要检查权限,请考虑使用 Ember-Can