2016-05-05 3 views
1

In meiner Ember-Anwendung habe ich eine Karte von Routen und CRUD-Berechtigungen, die vom Server zurückgegeben wird. Wenn ein Benutzer keinen Lesezugriff auf eine Seite hat, kann ich den Menüeintrag leicht ausschließen, aber für Create- und Update-Vorgänge muss ich einige Änderungen in router.js vornehmen.Was ist die beste Vorgehensweise zum Registrieren von Routen basierend auf Berechtigungen in Ember.js?

So zur Zeit ist dies der Router habe ich:

import Ember from 'ember'; 
import config from './config/environment'; 

const Router = Ember.Router.extend({ 
    location: config.locationType 
}); 

Router.map(function() { 
    this.route('product-types', function() { 
     this.route('view', {path: '/:product-type_id'}); 
     this.route('edit', {path: '/:product-type_id/edit'}); 
    }); 
    this.route('products'); 

    this.route('members', function() { 
     this.route('view', {path: '/:member_id'}, function() { 
      this.route('member-accounts', function() { 
       this.route('new'); 
      }); 
     }); 
     this.route('edit', {path: '/:member_id/edit'}); 
     this.route('new'); 
    }); 
    this.route('tasks', function() { 
     this.route('view', {path: '/:task_id'}); 
    }); 

}); 

export default Router; 

So möchte ich irgendwie in der Lage sein, einfach nicht um die Strecke zu registrieren: neue und oder bearbeiten, wenn der Benutzer nicht die richtigen Berechtigungen verfügt, :

Aber ich bin auf der Suche nach einer besseren Lösung, da die Routen in großen Zahlen wachsen. Also möchte ich vielleicht diesen Ember's Router anpassen, um dies automatisch zu tun. Ist das möglich?

Das andere Problem ist Löschen. Da Delete keine bestimmte Route hat, möchte ich diese Berechtigung standardmäßig automatisch an jedes Modell übergeben können, so dass jedes Modell prüft, ob ein Löschen möglich ist oder nicht, und dann die Schaltfläche zum Löschen ausblenden.

Ich mache mir keine Sorgen über einen Benutzer hackt die js-Dateien und aktiviert die Seiten und versucht, auf die verbotenen Seiten zuzugreifen, weil sie nichts tun können, da der Server sie stoppen wird und alle Berechtigungen überprüfen, aber ich möchte hier a Mechanismus zum Ausblenden/Anzeigen von Seiten, Schaltflächen basierend auf Berechtigungen. Jede Hilfe wird geschätzt.

+1

Sie schafft keine Routen auf Berechtigungen basiert, sondern nur verstecken Funktionen, die Benutzer haben keinen Zugriff auf als TameBadger schon sagt - das ist viel einfacher – marcoow

Antwort

3

Ich denke, dass Sie in der Lage sein werden, viele Ihrer Probleme mit Mixins zu lösen. Für Ihre Routing-Berechtigungen empfehle ich Ihnen, sich die UnauthenticatedRouteMixin von ember-simple-auth anzusehen. Sind hier etwas von the related code:

export default Ember.Mixin.create({ 
    /** 
    The session service. 
    @property session 
    @readOnly 
    @type SessionService 
    @public 
    */ 
    session: service('session'), 

    /** 
    Checks whether the session is authenticated and if it is aborts the current 
    transition and instead transitions to the 
    {{#crossLink "Configuration/routeIfAlreadyAuthenticated:property"}}{{/crossLink}}. 
    __If `beforeModel` is overridden in a route that uses this mixin, the route's 
    implementation must call `this._super(...arguments)`__ so that the mixin's 
    `beforeModel` method is actually executed. 
    @method beforeModel 
    @param {Transition} transition The transition that lead to this route 
    @public 
    */ 
    beforeModel(transition) { 
    if (this.get('session').get('isAuthenticated')) { 
     transition.abort(); 
     Ember.assert('The route configured as Configuration.routeIfAlreadyAuthenticated cannot implement the UnauthenticatedRouteMixin mixin as that leads to an infinite transitioning loop!', this.get('routeName') !== Configuration.routeIfAlreadyAuthenticated); 
     this.transitionTo(Configuration.routeIfAlreadyAuthenticated); 
    } else { 
     return this._super(...arguments); 
    } 
    } 
}); 

Die Löschtaste Ausgabe sollten Sie mit lösen entweder einem anderen mixin der Lage sein, in dem Sie die Berechtigung in einer Löschaktion zu überprüfen, oder eine mixin zu Komponenten hinzufügen, die Erlaubnis bezogene Logik injizieren oder ein Kombination von Arten.

Sie können versuchen, einen Dienst zu verwenden, der die Berechtigungen für den aktuellen Benutzer enthält, und einige Berechnungen basierend auf denen, die Sie in die erforderliche Komponente injizieren. Dies könnte eine Löschschaltfläche oder eine Formularkomponente oder etwas sein und die Anzeige der Löschschaltfläche in der Formularkomponente umschalten. Das wäre in etwa so aussehen:

//services/permissions.js 
export default Ember.Service.extend({ 

    hasPermission: Ember.computed('permissions', function(){ 
     return true/false // permission logic here 
    }) 

}) 

//components/component-permissions 
export default Ember.Component.extend({ 
    permissions: Ember.inject.service(), 
    hasPermission: Ember.computed.alias('permissions.hasPermission') 
}); 

//templates/components/components-permissions 
{{#if hasPermission}} 
    <button class='i-am-a-delete-button'>Delete</button> 
{{/if}} 
+0

Dank. Ich denke, dass dieser Service die beste Option ist. Ich denke, dass dies verwendet werden kann, um auch andere Operationen zu überprüfen. Ich werde es versuchen und Ihnen das Ergebnis mitteilen – xbmono

Verwandte Themen