2010-04-12 61 views
2

我們正在使用swing編寫具有豐富GUI客戶端的三層應用程序,並且我們需要添加一些身份驗證和授權控制。 我在這個話題中是全新的,所以我在網上做了一些研究。我的第一個意圖是使用JAAS來實現此功能,但據我所知,JAAS只包含執行特權方法/操作的功能,但似乎沒有功能來確定訪問是否被授予某些「操作」給控制GUI。例如隱藏/禁用某些菜單等。用於java GUI應用程序的身份驗證和授權框架

我理解這個錯誤還是我的方法錯誤?有沒有其他的JAAS?是否存在向GUI應用程序添加認證和授權的「最佳實踐」?

感謝您的幫助, ENY

回答

3

豐富的GUI客戶端是一個標準的網站沒有什麼不同。兩者都是客戶端,並控制潛在的攻擊者。所以不管你想到什麼安全性,堅定的人都可以打破它。 請記住,隱藏/禁用UI上的按鈕的整個想法是可用性,而不是安全性。

首先,向所有用戶顯示所有按鈕,但確保如果正常點擊管理按鈕,服務器不允許它。一旦你的服務器端認證正確,添加墊片來隱藏/禁用UI上的按鈕。爲此,您可以編寫一個服務來返回登錄用戶擁有的角色/權限。

JAAS是一種完美的服務器端身份驗證技術。您應該能夠找到很多文檔來保護服務器資源。

您的用戶必須登錄到Swing GUI,並且必須由服務器進行身份驗證。這是最重要的一步。如果你不用服務器驗證用戶,那麼它根本就沒有安全性。

此後,每按一次按鈕,任何用戶操作都會轉到服務器,該服務器會驗證用戶是否具有權限。如果他不這樣做,則向客戶端拋出異常。這樣,如果某人通過一些欺騙手段啓用了你的按鈕,服務器就會抓住它。

+0

所以我正確地理解它,你建議在服務器端實現JAAS? 服務器與WebService一起工作,在這種情況下,每次調用WebService例程時都需要傳遞驗證信息,否則我需要在服務器上長時間維護LoginContext,我們不需要。 – Enyra 2010-04-13 09:21:21

+0

請勿在每次請求時傳遞登錄名/密碼。相反,只需傳遞一個會話標識符/令牌,即使常規jsessionid也可以工作。您可以選擇在一段時間不活動後終止會話,在這種情況下,您不必長時間維護LoginContext(但用戶必須重新登錄)。或者你可以讓它們長壽,在這種情況下,你必須將會話標識符保存在數據庫中。 – 2010-04-13 10:25:45

0

雖然@ sri的答案提供了一些好的建議,但只是傳遞會話標識符/標記是很危險的,因爲它太容易被欺騙。您需要建立一個通過可信來源驗證的公共上下文。有關詳細信息,請參閱org.ietf.jgss.GSSContext

爲了獲得一個GSS上下文的工作,你會接觸到一個Key Distribution Center (KDC)的概念,通常會導致Kerberos和普通的某種目錄服務器 - 抱歉,我有點模糊,但不知道只是你有什麼地方,很難具體,甚至那時我只用Active Directory做到這一點。

一旦你有了一切認證,你可以返回到你保護某些功能的原始點。

驗證過程將提供一個javax.security.auth.Subject,其中將包含一個或多個java.security.Principal s。這些委託人可以與JAAS一起使用來創建使用here所述的委託人的政策文件。通常,您使用主體來表示用戶具有從目錄服務器加載的角色。在過去,我專門設計了登錄模塊來做到這一點,儘管可能有更好的方法。

這一切都鎖定了,所以最後一步是讓它看起來很漂亮,在這裏,盡我所知,你是獨立的。您可以簡單地保留所有內容,並警告用戶操作無法執行,或者因爲您已根據組成員資格進行更復雜的操作。

0

使用JAAS

JAAS是一個通用的框架,不會給任何特定應用功能,如禁用/啓用按鈕等 你必須嵌入該授權邏輯到應用程序中,JAAS爲您提供一個句柄經過認證/授權的主體對象,在這種情況下非常方便。