2012-02-15 23 views
2

讓我通過承認這是我的第一個Web應用程序和第一次使用JSF的經驗來做到這一點,所以我可能做出了一些糟糕的設計決定。將一次性「供應」過程與JSF結合在一起?

下面是我想要做的: 我有一個web應用程序使用JSF 2.0,它可以通過Facebook的畫布訪問。這個網絡應用程序允許用戶查看/操作來自傳感器讀數數據庫的數據。 Facebook用戶第一次訪問我的應用程序時,我要求用戶輸入數據庫的登錄憑據,然後將用戶發送到主頁。此後,用戶應該總是直接進入主頁,因爲我將用戶的FB ID與數據庫用戶配置文件相關聯。

當前實現: 我有Facebook的畫布URL到servlet。此servlet檢查Facebook傳遞的signed_request參數以獲取用戶標識,然後查看數據庫以查看用戶是否已完成供應過程。如果用戶這樣做了,他將被重定向到應用程序主頁。

問題: 我的大多數邏輯做這些檢查目前存在於一個託管bean(會話範圍)內。爲了在servlet中使用bean,我手動實例化bean並將其添加到會話中,因爲JSF框架還沒有機會創建它。由於我的系統變得越來越複雜,由於各種bean之間的依賴關係,這導致了問題。此外,這似乎是一個通常不好的方法來解決這個問題。

解決方案?從我的網頁搜索中,聽起來好像有幾種方法可以做到這一點。一種方法是將畫布設置爲JSF登錄頁面,其中託管bean將獲取signed_request參數並驗證用戶是否已完成供應步驟。從那裏,bean將轉發到適當的頁面。另一種可能性可能是有一個渴望的bean可以做同樣的事情,但這看起來「錯誤」。

解決這個問題並堅持「正確的」JSF範式的最好方法是什麼?

在此先感謝!

回答

1

有很多不同的方法可以處理。 JSF登陸頁面是一個想法,渴望bean是可以處理的一些方法。

如果您忽略了與Facebook集成的事實,那麼您最終會嘗試解決身份驗證和授權問題。 Facebook正在處理您的身份驗證,並告知您的Web應用程序用戶的身份,並且這是您的Web應用程序的工作,以便在整個會話期間記住該人的身份,並且授權此人訪問請求的頁面。

我已經實現了它,在那之前,我的所有託管的bean都擴展了一個BaseBean類,它在創建和初始化時檢查是否存在包含用戶標識信息的特定SessionScoped bean。如果這個bean不存在或者沒有被授權訪問這個bean,那麼我會重定向。這種方法的問題是它只授權使用託管的bean,而不是頁面。

我的另一個方法是利用一個servlet過濾器,它基本上檢查每個頁面請求並查找包含當前已通過身份驗證的用戶的會話作用域bean。如果沒有找到,那麼我會查找具體的請求參數並進行身份驗證並創建會話bean,如果不存在會重定向到未授權頁面。

這種方法運行良好,直到我意識到Java Web應用程序的認證和授權是一個很好理解和接近普遍的問題。經過一番研究和研究後,我發現像Spring Security 3這樣的安全框架確實可以集成到JSF中,並且幾乎可以處理複雜身份驗證和授權的所有複雜性。您可以非常輕鬆地將Spring Security的自定義Facebook身份驗證處理程序和用戶角色的控制訪問權限集成到單個頁面級別,這些都來自XML配置。如果你有時間學習新的東西,這是非常值得的。

+0

感謝您的意見!這基本上是一個原型實現,所以在這一點上我不太在意安全性。無論如何,我的應用程序不允許在沒有來自Facebook的有效signed_request的情況下檢索數據,所以我認爲我現在很安全。談到生產代碼,我會研究一個更強大的安全機制。 – mohlendo 2012-02-18 08:18:06

相關問題