2017-05-26 148 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