2017-02-15 33 views
5

我開發我有一個用戶區和管理區的應用程序。我已將這些分離爲獨立的Angular 2模塊。我已經成功實現了延遲加載,因此只有在用戶請求'/ admin'時才能加載管理模塊。安全地護衛懶加載模塊(角2)

從角2文檔,我看到,我可以指定一個 「canLoad」 後衛,像這樣:

{ 
    path: 'admin', 
    loadChildren: 'app/admin/admin.module#AdminModule', 
    canLoad: [AdminGuard] 
    } 

和實施AdminGuard類中的函數canLoad像這樣:

canLoad(route: Route): boolean { 
    return this.authService.isAdmin(); 
} 

(其中isAdmin()可以對後端API的調用這將返回當前用戶或類似的東西)的作用

但是,這實際上阻止任何非管理員從加載AdminModule?除非我誤解,否則所有這些代碼都位於客戶端,那麼是否有任何事情可以阻止客戶端修改「canLoad」方法,以便始終返回true?像這樣:

canLoad(route: Route): boolean { 
    return true; 
} 

因此允許客戶端加載他們想要的任何模塊。

顯然給後端的API,需要管理員狀態的任何呼叫都將受到保護,但它似乎是任何用戶都可以查看管理界面,這只是似乎有點怪我。有人可以幫我清楚嗎?

回答

4

這是一個很大的問題,我很好奇,如果有人確實對此有一個詳細的解答。所以我發現這個鏈接有一個非常好的對話。真正伸出我

Angular 2 Reddit Article

一種意見是這一個。

在SPA中講話,一般html模板和你的js文件都會在 之外,對於任何人來說都足夠關心檢查。只是,模板屆時將 填充在客戶端這樣的數據:您的SPA將數據(JSON讀)說 到您的服務器。所以你主要關心的是 保護這個API。會話,cookie,令牌,都意味着 仍然有效。我自己使用令牌進行身份驗證和授權。 API請求將包含服務器簽名令牌,然後將其 驗證,並從角色和憑證提取,然後用 確定該用戶是否有權作出這樣的請求。失敗 檢查將返回401未經授權的客戶端。在角度方面,我們 保存成功登錄後收到的令牌,然後將其用於 後續請求。我還解碼憑證和角色,並與 它顯示用戶信息和授權路線。通過CanActivate接口實現的角度守衛角色爲 ,您可以鏈接多個 :{Path:'protected',CanActivate:[LoggedInGuard]},{Path: 'supersecret',CanActivate:[LoggedInGuard,AdminGuard]}。 ..等但客戶端(讀取:角度)守衛最終是UX的問題,而不是一個 安全手段。一個知識淵博的黑客可以用dev控制檯搗亂 變量,或者直接使用appi 調用繞過它。向用戶展示發生了什麼錯誤,並在其他地方導航 等等。

+0

這不是真正的問題答案。它確實鏈接到一個很好的對話。到目前爲止,我在這個主題上找到的信息未能確定具有此功能的明確理由,或者無法解決此問題。幾分鐘前我發佈了這個問題:https://stackoverflow.com/questions/47613907/ – BBaysinger