2016-10-03 41 views
0

我有一個Auth管道。Aurelia管道未按預期工作

run(navigationInstruction, next) { 
    if (navigationInstruction.getAllInstructions().some(i => i.config.auth)) { 
     var isLoggedIn = this.auth.isAuthenticated() 
     if (!isLoggedIn) { 
      return next.cancel(new Redirect('login')); 
     } 
    } 
    return next(); 
} 

正如你可以看到,如果未經驗證的用戶試圖訪問他們重定向到登錄頁面的身份驗證頁面它會檢查。這工作。現在我想要實現的是相反的,如果用戶登錄並試圖訪問我想他們重定向到儀表板

run(navigationInstruction, next) { 
    var isLoggedIn = this.auth.isAuthenticated() 
    if (navigationInstruction.getAllInstructions().some(i => i.config.auth)) { 
     if (!isLoggedIn) { 
      return next.cancel(new Redirect('login')); 
     } 
    } else { 
     if (isLoggedIn) { 
      return next.cancel(new Redirect('dashboard')); 
     } 
    } 
    return next(); 
} 

非認證頁面現在,這也適用然而它引起的錯誤我相信。如果我嘗試訪問非授權頁面,並且我沒有授權,它會重定向到登錄頁面。所以更具體的例子是我登錄頁面,我沒有通過身份驗證,我試圖去註冊頁面,我只是重定向到登錄頁面。現在我認爲由於某種原因,i.config.auth認爲它是真實的,但我做了一些調試,我意識到return next()實際上碰到它加載註冊模板,但它然後重定向回到登錄頁面。

我也注意到,僅僅是移動if語句相同的錯誤發生的外var isLoggedIn功能:

run(navigationInstruction, next) { 
    var isLoggedIn = this.auth.isAuthenticated() 
    if (navigationInstruction.getAllInstructions().some(i => i.config.auth)) { 
     if (!isLoggedIn) { 
      return next.cancel(new Redirect('login')); 
     } 
    } 
    return next(); 
} 

UPDATE

這裏是我的路線

config.map ([

{ route: '', redirect: 'login' }, 
    { route: 'login', moduleId: 'components/login/login', title: 'Login', name: 'login' }, 
    { route: 'register', moduleId: 'components/register/register', title: 'Register', name: 'register' }, 
    { route: 'dashboard', moduleId: 'components/dashboard/dashboard', title: 'Dashboard', auth: true, name: 'dashboard' }, 
]); 
+0

您可能在這裏遇到了範圍問題。您是否嘗試過使用「let」而不是「var」作爲isLoggedIn變量(在if語句之內還是之外)?這可以幫助防止當前值泄漏到下一個呼叫中。 –

+0

@FredKleuver我曾嘗試將它切換到讓和我不認爲這是一個範圍問題,因爲'isLoggedIn'總是我所期望的即使在if語句內 – Rodrigo

+0

你說的真的不應該發生,如果'auth '註冊'路線的財產確實是虛假的或未定義的。所以,如果我正確理解你的問題:你沒有登錄,你從'登錄'導航到'註冊'。首先,'run'被命中,'return next();'被調用。其次,'run'被再次擊中並返回next.cancel(新的重定向('login'));'被調用。它是否正確? –

回答

0

我建議使用Additional Route Data (settings)來存儲自定義設置。這些額外的數據將始終在管道功能中可用。

下面是一個完整的演示:https://gist.run/?id=b70a094db52e0cc34fd7c44de550f046

  • Home Page是公共的,提供給大家
  • Dashboard需要驗證
  • Login PageRegister Page可供未經認證的用戶僅
  • 使用Toggle Login按鈕來更改身份驗證狀態
  • 當一個導航到Dashboard無需驗證,當一個導航到LoginRegister與認證重定向發生Login Page
  • ,重定向發生Dashboard

app.js

路線

config.map([ 
    { 
    "route": ["", "home"], 
    "name": "home", 
    "moduleId": "home", 
    "nav": true, 
    "title": "Home" 
    }, 
    { 
    "route": "dashboard", 
    "name": "private-page", 
    "moduleId": "private-page", 
    "nav": true, 
    "title": "Dashboard Page", 
    // this is going to be available within AuthorizeStep 
    "settings": { 
     "auth": true 
    } 
    }, 
    { 
    "route": "login", 
    "name": "login", 
    "moduleId": "login", 
    "nav": true, 
    "title": "Login Page", 
    "settings": { 
     "publicOnly": true 
    } 
    }, 
    { 
    "route": "register", 
    "name": "register", 
    "moduleId": "register", 
    "nav": true, 
    "title": "Register Page", 
    "settings": { 
     "publicOnly": true 
    } 
    } 
]); 
有關章節

管道

// substitute auth magic 
static auth = { 
    isAuthenticated: false 
} 

run(navigationInstruction, next) { 
    let isLoggedIn = AuthorizeStep.auth.isAuthenticated; 

    // currently active route config 
    let currentRoute = navigationInstruction.config; 

    // settings object will be preserved during navigation 
    let loginRequired = currentRoute.settings && currentRoute.settings.auth === true; 

    if (isLoggedIn === false && loginRequired === true) { 
     return next.cancel(new Redirect('login')); 
    } 

    let publicOnly = currentRoute.settings && currentRoute.settings.publicOnly === true; 
    if (isLoggedIn === true && publicOnly === true) { 
     return next.cancel(new Redirect('dashboard')); 
    } 

    return next(); 
} 
+0

我爲我的路線使用其他路線數據我已更新我的問題以顯示 – Rodrigo