2011-10-24 81 views
5

我正在嘗試使用Dojo開發純JavaScript Web應用程序。我面臨的問題是限制對應用程序部分的訪問。經過身份驗證的用戶應該可以訪問所有內容,而未經身份驗證的用戶應該只能訪問登錄屏幕。dojo web應用程序認證

問題是,沒有任何東西(我知道)會阻止用戶打開瀏覽器JavaScript終端並輸入如下內容:app.displayRestrictedContent();,從而獲得用於經過身份驗證的用戶的屏幕訪問權限。

我已經實現了基於ajax的登錄;所有的ajax調用都通過會話進行保護。因此,雖然未經過身份驗證的用戶可以加載受限制的屏幕,但他們無法爲其提取數據。但是,這個屏幕可以任意訪問似乎是錯誤的。

我想要做不可能的事情嗎?當它很容易規避時,編寫代碼如if (user.auth) app.displayRestrictedContent();似乎很愚蠢。這使我相信我錯過了對其他人來說相當明顯的東西。在基於純JavaScript的應用程序和身份驗證模型中,我找不到任何信息。

+0

順便說一句,後端是通過cakePhp實現的。 – andreb

回答

1

我絕不是專家,但這裏有一些想法,我這個做。我不認爲你錯過了任何東西(如果是這樣,我也有) - 我認爲這是所有客戶端應用程序的一個非常基本的問題,不管它是編譯的可執行文件還是Javascript。

當然,編譯好的可執行程序並沒有受到特別的阻礙,因爲它被製作成機器代碼,這些代碼很難讀取或反編譯成任何有用的東西。但是,使用Javascript時,應用程序通常會按照您所寫的完全一樣提供,因此很容易修改和推理。

這給我帶來了第一個半解決方案:混淆你的Javascript。如果使用帶有shrinksafe參數的Dojo構建工具,將刪除所有不必要的空白,並縮短所有標識符,使代碼難以閱讀。我稱這爲半解決方案,有人甚至可以說這是一種半信用 - 我仍然認爲這是值得的。畢竟,縮小的代碼下載速度也更快!

我在我的應用程序中採取的第二個措施是將不同的部分分爲「構建層」。舉例來說,在我的建造輪廓,我會像

dependencies = { 
    .. 
    layers: [ 
     { name: "../myApp/Core.js", resourceName: "myApp.Core", 
      dependencies: ["myApp.Core", "myApp.Foobar"] 
     }, 
     { name: "../myApp/modules/Login.js", resourceName: "myApp.modules.Login", 
      dependencies: ["myApp.modules.Login", "myApp.modules.LoginUi"...], 
      layerDependencies: ["../myApp/Core.js"] 
     }, 
     { name: "../myApp/modules/Secret.js", resourceName: "myApp.modules.Secret", 
      dependencies: ["myApp.modules.Secret", "myApp.modules.SecretUi"], 
      layerDependencies: ["../myApp/Core.js"], 
      authentication: 42 
     } 
    ] 
} 

現在,而不是直接服務內置JS文件爲靜態文件,我讓請求都通過我的服務器端的應用的控制器,它檢查JS層是否需要身份驗證以及用戶是否使用必要的訪問權限登錄。

這確實有一定的缺點。 JS文件沒有被緩存,如果我在一個構建層中擁有所有的JS,應用程序可能會稍微加載一些內容。當然,製作這些圖層的價值也是有限的。更多的圖層意味着更多的麻煩,但也更細粒度的模塊訪問。

我很想聽到別人對此的評價。這是一個很好的問題。

+0

謝謝。這是很好的信息。 – andreb

+0

你可以談談更多關於用於獲取js資產回瀏覽器的分層和認證系統嗎? – andreb

1

當用戶成功登錄服務器時,應該爲他提供一個會話令牌。之後,無論用戶何時請求資源(通過重定向瀏覽器或通過AJAX),他都會向服務器顯示其會話標記(通過將其存儲在cookie中並自動發送所有請求或通過明確地將其傳遞到主體的AJAX請求)

然後,服務器可以使用來自用戶的會話令牌來控制服務器端的授權,拒絕任何具有無效或過期令牌的請求。

https://en.wikipedia.org/wiki/HTTP_cookie#Session_management

+0

謝謝,我有一個會議的工作知識。這個問題直接涉及Javascript應用程序的客戶端特性以及非授權用戶如何訪問受限區域。 – andreb

+1

這就是我所說的。在客戶端,您可以保留一個會話標識符,您可以使用它來驗證自己。在服務器端,您根據所呈現的會話標識符授權訪問資源(這需要在服務器端完成 - 客戶端不可信)。 (順便說一下,我沒有看到接受的答案與認證有什麼關係 - 它只是談論dojo構建系統,並且它很容易*解決壓縮的Javascript問題) – hugomg

+0

答案提供了有關開發JavaScript應用程序的信息使用Dojo,這也是我所做的。答案以特定的方式解決了我的問題。 – andreb

2
But still, It seems wrong for this screen to be arbitrarily accessible. 

因爲它是客戶端代碼。任何你在js中編寫的東西,或者被編譯成js,都希望它可以被用戶讀取。

Am I trying to do the impossible? 

您可以在用戶驗證後動態加載js模塊。所以起初只需加載1個登錄模塊。當用戶登錄時,如果成功,服務器返回要加載的js模塊列表,如果沒有,則返回空列表。它還有助於縮短用戶訪問您的網站時的加載時間。

相關問題