2017-05-26 98 views
4

我有一个API的NodeJS如下图所示在emberjs中管理用户角色?

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用户包含用户角色的字段。每个用户角色都有不同的仪表板。 我已经实现余烬-简单-AUTH与oauth2-password-grant和仪表盘上的模板下方

{{#if session.isAuthenticated}} 
    {{#app-dashboard}} 
    {{/app-dashboard}} 
{{else}} 
    {{#landing-app}} 
    {{/landing-app}} 
{{/if}} 

所示那样的问题是如何可以在用户角色之间进行区分。一种方法可能是使用ajax请求获取角色,但这意味着所有视图都会有一个额外的XHR请求。 在Ember.$中使用XHR的另一个问题是授权令牌未附加到请求。解决这个问题的最好方法是什么?

回答

2

我还没有使用过ember-simple-auth,但是可能有帮助的一种方法是在成功的用户“登录”上发送角色/权限对象以及令牌。然后创建一个'用户权限'Ember服务,该服务存储角色/权限对象,并可以在需要时检查用户是否具有某种权限。我将使用一个数组作为示例权限对象。您应该可以通过一个XHR请求来执行此操作。

当然,任何客户端“安全”本质上都是不安全的,因此请确保您的路由免受服务器端的用户行为影响。

首先,您需要在数据库中与用户关联的角色或权限。然后向您的Node API添加一些逻辑,以便为经过身份验证的用户以及该令牌返回一个权限列表。

然后,在灰烬,像这样定义权限的服务:

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); 
    } 
}); 

当你的灰烬应用匹配您的节点的API,将获得的权限,一个成功的响应对象。在对象上设置像这样在你的成功回调(记得要注入你的服务)的权限服务:

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请求手动完成它(根据在请求中设置头对象),或者如果你想将其附加到每个灰烬数据请求,定制REST接口应该工作:https://guides.emberjs.com/v2.13.0/models/customizing-adapters/#toc_headers-customization