2014-10-29 45 views
1

在顯示鏈接/操作之前,模板應該如何查找用戶對特定路線的訪問權限?如何驗證模板中的ACL

考慮到路由已經包含授權角色列表,應該簡單的模板幫助程序/組件查找視圖屬性並驗證訪問?

(類似{{#if has-access-to 'items.new'}}?)

路線目前 「保護」 用一個簡單的ACL解決方案:

AclRouteMixin

import Ember from 'ember'; 

var accountTypes = { 
    1: 'member', 
    2: 'manager', 
    3: 'owner' 
}; 

export default Ember.Mixin.create({ 
    beforeModel: function beforeModel(transition) { 
     this._super(transition); 

     var accountType = this.get('session.accountType'); 
     var role = accountTypes.hasOwnProperty(accountType) ? accountTypes[accountType] : 'unknown'; 

     if (this.get('roles') && !this.get('roles').contains(role)) { 
      transition.abort(); 
      this.transitionTo('unauthorized'); 
     } 
    } 
}); 

路線

export default Ember.Route.extend(AuthenticatedRouteMixin, AclRouteMixin, { 
    roles: [ 'manager', 'owner' ] 
}); 

EDIT

由於服務器知道的權限它比試圖複製的授權邏輯容易得多包括policy對象(或每個實體屬性)。

+2

[這] (https://www.youtube.com/watch?v=KzasJuhsTSs&index=13&list=PLLUBPLc28H8c8ihVHkYeRHe8OiB8P5WL0)可能與您有關 – MilkyWayJoe 2014-10-29 21:02:55

+0

感謝@MilkyWayJoe,視頻真的很有幫助。服務器已經實現了ACL和其他權限管理,就像它在視頻中完成的一樣。 – 2014-11-03 13:21:15

回答

2

This talk(鏈接MilkyWayJoe)解釋了一種設置認證/ ACL的非常簡單的方法。

會話對象(或每個API響應)可能包含一個Policy對象,其中包含true/false值。

模板

{{#if session.policy.canCreateItems}}{{link-to 'New Item' 'items.new'}}{{/if}} 
{{#if item.policy.canEdit}}{{link-to 'Edit' 'items.edit' item}}{{/if}} 

身份驗證(如果使用ember-simple-auth

var session = { 
    userId: response.user_id, 
    policy: {} 
}; 

for(var p in response.policy) { 
    if (response.policy.hasOwnProperty(p)) { 
     session.policy[p.camelize()] = response.policy[p]; 
    } 
} 

API響應

{ 
    "items": [{ 
     ... 
     policy: { 
      can_delete: true, 
      can_view: true, 
      can_edit: true 
     } 
    }], 
    "policy": { 
     can_create: true 
    } 
} 
1

我會做是加載一個auth路由所有其他路線延伸,如檢查,並顯示鏈接我與組件徑自上的權限的方式:

import Ember from 'ember'; 

var Component = Ember.Component; 

export default Component.extend({ 

    hasPermission: function() { 
    var permission = this.get('permission'); 
    return this.get('auth.permissions').indexOf(permission) !== -1; 
    }.property('permission') 
}); 

至於模板:

{{#if hasPermission}} 
    {{yield}} 
{{/if}} 

,簡單地把它從鏈接:

{{#can-do permission="view_tables"}} 
    {{link-to "tables" "tables" class="nav__link"}} 
{{/can-do}} 

希望它可以幫助。如果您有任何問題,請告訴我。

+0

感謝您的回答。在評估了不同的選項後,我去了一些接近談話的東西@MilkyWayJoe(https://www.youtube.com/watch?v = KzasJuhsTSs&index = 13&list = PLLUBPLc28H8c8ihVHkYeRHe8OiB8P5WL0)鏈接。會話對象保存着一個'''''''''''''''',並且模板的評估結果如下:'{{#if session.policy.canDeleteItem}} {{/ if}}'。 'policy'對象可以包含幫助函數。 – 2014-11-03 16:25:55

+0

@MartinSamson哈哈耶我看到了^^ – 2014-11-03 16:39:41