2017-04-01 14 views
9

我的應用程序允許根據用戶角色訪問內容。我爲每個角色寫了一個Router Guard。有些內容允許訪問角色1或角色2或角色3。我應該如何在feature-routing.module.ts文件中寫入canActivate聲明?據我所知,如果我寫Angular 2如何在同一路徑上應用Or-Relationship上的多個警衛

canActivate:[Role1Guard, Role2Guard, Role3Guard] 

如果有任何警衛返回false,則訪問將被拒絕。但就我而言,如果任何一名警衛回覆真實,我應該允許進入。怎麼做?提前謝謝了!

+1

最簡單的解決方案是創建一個後衛,是以3個角色進去,這就是我的那一刻,Role1or2or3Guard做,但我喜歡一個更好的解決方案,我可以結合我現有的警衛...... – Seb

+0

是的,我也想過這個解決方案。對於一種情況,這將起作用,並且很容易實現。問題只發生在當你想概括它......如果你有5個角色,並且每一個組合都是可能的,你需要一個機器人來寫所有的守衛類..... –

+1

是的,我知道,我有完全相同的問題...等待有人給你一個真正的解決方案;) – Seb

回答

1

我們在這種情況下可以做的事情是創建一個主衛隊這將觸發應用程序衛士根據我們的要求換貨。

結帳this回答瞭解方法。

假設你已經通過它上面的鏈接,這種情況下的方法可以像修改Route類中的data屬性一樣簡單。

事情是這樣的 -

{ 
    path: "view2", 
    component: View2Component, 
    //attach master guard here 
    canActivate: [MasterGuard], 
    //this is the data object which will be used by 
    //masteer guard to execute guard1, guard 2, guard 3 & guard 4 
    data: { 
     trigger: { 
      operator: "OR", 
      guards: [ 
       GUARDS.GUARD1, 
       GUARDS.GUARD2, 
       GUARDS.GUARD3, 
       GUARDS.GUARD4 
      ] 
     } 
    } 
} 

然後用operator標誌相應解僱所有警衛。

我希望這有助於:)

1

你可以寫OrGuard,是這樣的:

class OrGuard() { 
    guards: any[]; 
    constructor(...guards) { this.guards = guards } 

    canActivate() { 
    return this.guards.some(Boolean); 
    } 
} 

,並使用它像這樣:

canActivate:[new OrGuard(Role1Guard, Role2Guard, Role3Guard)] 

...只是一個想法,實際執行可能會有所不同,我沒有嘗試(;

+5

如果守衛有任何依賴關係,這將不起作用。例如,如果他們需要發出HTTP請求。一個服務或一個類工廠將工作 –

+0

@Aluan Haddad,請你詳細說明一下嗎?如何用服務做到這一點,以及如何與班級工廠一起做到這一點?提前謝謝了! –

+0

對不起,我一直都很忙。 –

相關問題