2016-02-18 105 views
0

我遵循Aurelia documentation关于添加导航管道步骤。导航管道奥里利亚

我已经创建了我的身份验证服务和AuthRouterPipelineStep:

import {inject} from 'aurelia-framework'; 
import {HttpClient} from 'aurelia-fetch-client'; 
import 'fetch'; 
import {Router} from 'aurelia-router'; 
import {AuthResult} from './authResult'; 
import {Redirect} from 'aurelia-router'; 

@inject(HttpClient, Router) 
export class Auth { 
    constructor(httpClient, router) { 
     this.httpClient = httpClient; 
     this.router = router; 
     this.internalIsLoggedIn = false; 
    } 

    login(username, password) { 

     if (username === "callum" && password === "password") { 
      this.router.navigate('products'); 

      this.internalIsLoggedIn = true; 
     } 

     return new AuthResult("Unable to login."); 
    } 

    get isLoggedIn() { return this.internalIsLoggedIn; } 
} 

@inject(Auth) 
export class AuthRouterPipelineStep { 
    constructor(auth) { 
     this.auth = auth; 
    } 

    run(navigationInstruction, next) { 
     console.log("Navigating"); 
     if (navigationInstruction 
       .getAllInstructions() 
       .some(i => i.config.settings.roles.indexOf('public') === -1)) 
     { 
      var isLoggedIn = this.auth.isLoggedIn; 
      if (!isLoggedIn) { 
       return next.cancel(new Redirect('welcome')); 
      } 
     } 

     return next(); 
    } 
} 

而在我的应用我已经配置了一切:

import {Auth, AuthRouterPipelineStep} from './auth/auth'; 
import {inject} from 'aurelia-framework'; 
import {Redirect} from 'aurelia-router'; 

@inject(Auth) 
export class App { 
    constructor(auth) { 
     this.auth = auth; 
    } 

    get isLoggedIn() { return this.auth.isLoggedIn; } 

    configureRouter(config, router) { 
     config.title = 'Reaper'; 
     config.addPipelineStep('authorise', AuthRouterPipelineStep); 
     config.map([ 
      { route: ['', 'welcome'], name: 'welcome',  moduleId: 'welcome',   nav: true, title: 'Home',  settings: { icon: 'fa-home', roles: ['public'] } }, 
      { route: 'contacts',  name: 'contacts',  moduleId: './contacts/index', nav: true, title: 'Contacts', settings: { icon: 'fa-' } }, 
      { route: 'companies',  name: 'companies', moduleId: './companies/index', nav: true, title: 'Companies', settings: { icon: 'fa-' } }, 
      { route: 'products',  name: 'products',  moduleId: './products/index', nav: true, title: 'Products', settings: { icon: 'fa-' } } 
     ]); 

     this.router = router; 
    } 
} 

我上的导航管道一步Run功能有console.log 。那永远不会被调用。我错过了什么......?

我知道,所有的导航步骤是由容器注入的,所以你可以在构造函数中有依赖...

回答

2

因此,作为奥里利亚测试版1的有在导航管道几个挂钩。一个是authorize,另一个是modelbind

因此,添加管道步骤的名称非常重要。我的代码中的Authorise是错误的,这就是为什么“中间件”没有被拾起。

但是,您可以叠起来的中间件,它会按顺序运行:

config.addPipelineStep('authorize', AuthRouterPipelineStep); 
config.addPipelineStep('authorize', AnotherAuthRouterPipelineStep);