2017-05-26 14 views
4

ユーザーのために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以下のように私はnodejs APIを持っているが、ユーザーの役割を持つフィールドが含まれています。各ユーザーの役割には異なるダッシュボードがあります。 私はoauth2-password-grantと燃えさし-シンプル-AUTHを実装しているし、ダッシュボード用のテンプレートが

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

の下に示されているような問題は、私は、ユーザーの役割を区別することができる方法です。 1つの方法は、役割を取得するためにajax要求を使用することですが、それはすべてのビューに対して追加のXHR要求を意味します。 Ember.$でXHRを使用する際のもう1つの問題は、許可トークンが要求に添付されていないことです。この問題を解決する最善の方法は何ですか?

答えて

2

私はember-simple-authを使用していませんが、成功するユーザー "login"のトークンと共に役割/権限オブジェクトを送信するのに役立つ1つのアプローチです。次に、ロール/パーミッションオブジェクトを格納し、ユーザが必要なときに特定のパーミッションを持っているかどうかを確認できる 'ユーザパーミッション' Emberサービスを作成します。私は、例のパーミッションオブジェクトとして配列を使用します。これは、単一のXHR要求で行うことができます。

もちろん、クライアント側の「セキュリティ」は本質的に安全ではないため、サーバー側のユーザーの行動からルートを保護するようにしてください。

まず、ユーザーに関連付けられたデータベースにいくつかのロールまたは権限が必要です。次に、ノードAPIにいくつかのロジックを追加して、認証されたユーザーの権限リストをそのトークンとともに返します。あなたのエンバーアプリがあなたのノードの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); 
    } 
}); 

その後、エンバーに、このような権限サービスを定義します。 (あなたのサービスを注入することを忘れないでください)あなたの成功コールバックでそうのような権限サービス上のオブジェクトを設定します。

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リクエストを使用して手動で行うことができます(リクエスト内のヘッダーオブジェクトをhttp://api.jquery.com/jQuery.ajax/)か、RESTアダプタが動作するはずのカスタマイズ、すべてのエンバーデータ要求にそれを添付する場合:https://guides.emberjs.com/v2.13.0/models/customizing-adapters/#toc_headers-customization

1

権限をチェックするために、Ember-Can

の使用を考慮
関連する問題