Servlet和JSP的安全問題
編寫Servlet和JSP是容易的,但通常我們會面臨很多安全問題。當然,我們會在程序中加入大量的安全代碼來解決這個問題,但加入這樣的安全硬編碼將使程序變得不靈活,而且不易維護。因此,在本文中將給出一種無需修改代碼即可達到安全目的方法,并提供了一個實例進行說明。
在本文中的例子將通過一個用戶名和密碼以及傳輸層的SSL來保護應用程序的war文件。用戶名和密碼以明文在網絡中傳輸。這一切并不需要編輯應用程序中的Java代碼和JSP頁。而為了使Servlet和JSP頁變得安全,我們要做的只是配置web.xml文件而已。
一、設置XML文件
配置web.xml文件的***步是定義一個安全約束,也就是一個
做完上面的設置后,下一步需要設置SSL。我們可以使用
***一步我們需要設置驗證方法。這需要設置
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>ServletApplication
- < SPAN>web-resource-name>
- <url-pattern>/*< SPAN>url-pattern>
- < SPAN>web-resource-collection>
- <auth-constraint>
- <role-name>ttrole< SPAN>role-name>
- < SPAN>auth-constraint>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL
- < SPAN>transport-guarantee>
- < SPAN>user-data-constraint>
- < SPAN>security-constraint>
- <login-config>
- <auth-method>BASIC< SPAN>auth-method>
- <realm-name>default< SPAN>realm-name>
- < SPAN>login-config>
- <security-role>
- <role-name>ttrole< SPAN>role-name>
- < SPAN>security-role>
在上述的例子中,只有用戶"ttrole"才能訪問Servlet和JSP頁。
在JavaEE環境中將使用這些用戶驗證,但在許多操作系統環境中,用戶和組關聯。因此,security-role-mapping在用戶頭組之間提供了一座橋梁。在JavaEE5應用服務器中,我們可以在sun-application.xml文件中按如下的方式字義security-role-mapping標簽:
- <sun-application>
- <security-role-mapping>
- <role-name>myrole< SPAN>role-name>
- <principal-name>myuser< SPAN>principal-name>
- < SPAN>security-role-mapping>
- <security-role-mapping>
- <role-name>ttrole< SPAN>role-name>
- <group-name>ttgroup< SPAN>group-name>
- < SPAN>security-role-mapping>
- <security-role-mapping>
- <role-name>arole< SPAN>role-name>
- <principal-name>ttuser< SPAN>principal-name>
- < SPAN>security-role-mapping>
- < SPAN>sun-application>
二、運行實例代碼
在這一節我們來講一下如何運行上面的程序。在這里我們使用的集成開發環境是NetBeansIDE5.5以及NetBeans企業開發包。在安裝完NetBeans后,我們需要進行以下幾步來運行這個程序。
1.首先我們需要下載這個程序,下載連接為:例子代碼。然后將其解壓。
2.啟動NetBeans。
3.打開webann工程(剛才zip文件中的NetBeans工程),如果出現一個"Resolvemissingserverproblem"提示信息,說明應用服務器還沒有被加到NetBeans的服務器列表中。我們可以選擇Tools>ServerManager,然后將相應的服務器加到列表中。
4.啟動Sun內嵌在NetBeans中的JavaSystemApplicationServer。我們還可以通過在命令中輸入如下的命令來啟動服務器:
上面的
5.建立一個用戶。我們可以通過管理控制臺來完成的(默認是http://localhost:4848),可按以下步驟操作:
(1)從左側的管理樹中選擇Configuration>Security>Realms>file。
(2)單擊"ManageUsers",然后單擊"New"。
(3)輸入以入信息。
UserId:ttuser
GroupList:ttgroup
NewPassword:ttpassword
ConfirmNewPassword:ttpassword
(4)單擊"OK",保存設置。
在建立***個用戶后,使用同樣的方式建立第二個用戶ttusers2,輸入信息如下:
UserId:ttuser2
GroupList:ttgroup
NewPassword:ttpassword
ConfirmNewPassword:ttpassword
6.按著以下步驟編譯NetBeans工程:
(1)右擊工程窗口的webann節點。
(2)選擇"CleanandBuildProject"。
在這個步驟中將建立ear文件,并將它們放到webann/dist目錄中。
7.按著以下步驟發布ear文件:
(1)右擊工程中的webann節點。
(2)選擇"DeployProject"。
除了上述的發布方法,我們還可以按以下的方式通過管理界面發布:
(1)在左側的控制樹中選擇Applications>EnterpriseApplications。
(2)單擊"Deploy"。
(3)單擊"Browser"按鈕找到ear文件
(4)單擊"OK"。
我們還可以通過如下的命令行發布ear文件:
asadmindeploywebann.ear
8.下面我們啟動瀏覽器,在地址欄中輸入https://
可能由于瀏覽器的不同,所看到的驗證信息不同,但一般會出現一個"unknownauthority",這是因為這個例子使用了self-sign驗證。然后瀏覽器將會出現一個選項,提示您是否繼續瀏覽應用程序。
如果我們選擇繼續瀏覽應用程序,系統將會提示我們輸入用戶名和密碼。如果我們使用ttuser登錄,將會看到類似如下的響應信息:
Hello,ttuser
EjbMessage:Hello,World,SatJun3012:04:46PDT2007
DataSourcelogintimeout:0
如果我們使用ttuser2登錄,將會看到類似如下的響應信息:
Hello,ttuser2
DataSourcelogintimeout:0
之所以它們的響應信息不同是因為它們所角色不同,用戶ttuser擁有"ttrole"和"arole"。而ttuser2只有"ttrole",而沒有"arole"。在這個應用程序中,只有擁有角色"arole"的用戶可以調用SlessLocal.hello(Stringmessage)方法,這個方法返回一個"Hello,World"信息。
當我們運行完這個程序后,可以按著如下的步驟卸載ear文件:
1.通過管理界面面卸載ear文件。
(1)在左側的功能樹中選擇Applications>EnterpriseApplications
(2)選擇"webann",然后單擊"Undeploy"。
2.通過管理界面面刪除用戶。
(1)選擇Configuration>Security>Realmn>file
(2)單擊"ManageUsers"。
(3)選擇ttuser和ttuser2。
(4)單擊"Delete"。
【編輯推薦】