1.J2EE安全性介紹
說明性的安全性:通過安全結構描述的方式來代表應用程序的安全需求,安全結構一般包括安全角色,訪問控制和驗證要求等。在j2ee平臺中部署描述符充
當了說明的安全性的主要工具。部署描述符是組件開發者和應用程序部署者或應用程序組裝者之間的交流工具。應用程序的開發者用它來表示應用中的安全需求,應用程序部署者或應用程序組裝者將安全角色與部署環境中的用戶和組映射起來。
在程序運行時容器從部署描述符中提取出相應的安全策略,然后容器根據安全策略執行安全驗證。說明的安全性不需要開發人員編寫任何安全相關的代碼,一切都是通過配置部署描述符來完成的。
可編程的安全性: 可編程的安全性在說明性的安全性的基礎上,使安全敏感的應用可以通過調用被容器提供的API來對安全作出決斷。這在說明性的安全性不足以滿足企業的安全模型的情況是非常有用的。比如J2ee在servlet HttpServletRequest interface中各提供兩個方法:
isUserInRole (HttpServletRequest)——判斷用戶角色
getUserPrincipal (HttpServletRequest) ——獲得用戶認證信息principal
另外,就是用戶自定義登錄認證,而不是使用J2EE的部署描述符里面的定義(三種登錄認證類型)。
2.基于J2EE的認證與授權
提到安全性,就不能不說到兩個概念:認證與授權。
認證是用戶或計算設備用來驗證身份的過程。授權是根據請求用戶的身份允許訪問和操作一段敏感軟件的過程。
這兩個概念密不可分。沒有授權,
就無需知道用戶的身份。沒能認證,就不可能區分可信和不可信用戶,
更不可能安全地授權訪問許多系統部分。
因為之前的項目100% web方式,所以本文只討論web應用的認證和授權。
A.認證方式:
Web客戶端通常通過http協議來請求web服務器端的資源,這些web資源通常包括html網頁、jsp(java server
page)文件、java
servlet和其他一些二進制或多媒體文件。在企業環境中,企業的某些資源往往要求只允許某些人訪問,有些資源甚至是機密的或安全敏感的。因此對企業中
各種web資源進行訪問控制是十分必要的。為了滿足企業中的不同安全級別和客戶化的需求,J2EE提供了三種基于web客戶端的認證方式:
HTTP基本認證(HTTP Basic Authentication)
HTTP基本驗證
是HTTP協議所支持的驗證機制。這種驗證機制使用用戶的用戶名和密碼作為驗證信息。Web客戶端從用戶獲取用戶名和密碼,然后傳遞他們給web服務
器,web服務器在指定的區域(realm)中驗證用戶。但需要注意的是,這種驗證方法是不夠安全的。因為這種驗證方法并不對用戶密碼進行加密,而只是對密碼進行基本的base64的編碼。而且目標web服務器對用戶來說也是非驗證過的。不能保證用戶訪問到的web服務器就是用戶希望訪問的。
基于表單的認證(Form-Based Authentication)
基于表單的驗證
使系統開發者可以自定義用戶的登陸頁面和報錯頁面。這種驗證方法與基本HTTP的驗證方法的唯一區別就在于它可以根據用戶的要求制定登陸和出錯頁面。基于
表單的驗證方法同樣具有與基本HTTP驗證類似的不安全的弱點。用戶在表單中填寫用戶名和密碼,而后密碼以明文形式在網路中傳遞,如果在網路的某一節點將
此驗證請求截獲,在經過反編碼很容易就可以獲取用戶的密碼。因此在使用基本HTTP的驗證方式和基于表單的驗證方法時,一定確定這兩種方式的弱點對你的應
用是可接受的。
基于客戶端證書的認證(Client-Certificate Authentication)
基于客戶端證書的驗證方式要比上面兩種方式更安全。它通過HTTPS(HTTP over SSL)來保證驗證的安全性。安全套接層(Secure
Sockets
Layer)為驗證過程提供了數據加密,服務器端認證,信息真實性等方面的安全保證。在此驗證方式中,客戶端必須提供一個公鑰證書,你可以把這個公鑰證書
看作是你的數字護照。公鑰證書也稱數字證書,它是被稱作證書授權機構(CA)-一個被信任的組織頒發的。這個數字證書必須符合X509公鑰體系結構
(PKI)的標準。如果你指定了這種驗證方式,Web服務器將使用客戶端提供的數字證書來驗證用戶的身份。
B.授權模型:
代碼授權(Code Authorization)
j2ee產品通過java 2 安全模型來限制特定J2SE的類和方法的執行,以保護和確保操作系統的安全。
調用者授權(Caller Authorization) ——這個是我們常用的方式
安全角色:安全角色是具有相同安全屬性的邏輯組。比如是admin,Supervisor等。
用戶和組:用戶和組是在實際系統環境下的用戶和用戶的集合。它們對應者現實當中的人和群體。
訪問控制:訪問控制可以確保安全角色只能訪問已授予它安全權限的授權對象。授權對象包括EJB的遠程方法、web資源(html網頁,jsp/servlet和多媒體或二進制文件)等。在j2ee中訪問控制在應用程序描述文件中與安全角色關聯起來。
映射:通過映射應用程序的系統管理員將實際系統環境中的用戶與安全角色聯系起來,從而是實際的用戶擁有對企業資源訪問的適當授權。
C.部署描述符安全性相關介紹:
安全約束——定義那些資源是受約束訪問的,以及認證通過后的授權范圍
<security-constraint> //安全約束部分
<web-resource-collection> //受約束的web資源集
<web-resource-name>WRCollection</web-resource-name> //資源集名
<url-pattern>/webtest.jsp</url-pattern> //資源的url表達式
<http-method>GET</http-method> //受約束的資源操作方法
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint> //對安全角色授權
<role-name>user</role-name> //安全角色名
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
定義安全角色
<security-role>
<description>this is a user</description>
<role-name>user</role-name>
</security-role>
基本的HTTP認證方式——使用不多
<login-config> //驗證方式設置
<auth-method>BASIC</auth-method> //使用基本的HTTP驗證方式
<realm-name></realm-name>
</login-config>
基于表單的認證方式——使用較多
<login-config>
<auth-method>FORM</auth-method> //使用基于表單的驗證方式
<realm-name>Default</realm-name> //使用缺省的安全域
<form-login-config>
<form-login-page>/login.html</form-login-page> //定義登陸頁面
<form-error-page>/error.html</form-error-page> //定義出錯頁面
</form-login-config>
</login-config>
基于證書的認證方式——與CA用戶數據中心一起使用
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
注:后兩種均在項目中應用過。
以上三種認證方式都屬于配置式登錄認證。
還有一種是程序性(編程式)的登錄認證,即通過web application自身進行驗證,比較典型的是利用過濾器代理操作。
比如開源的acegi,使用它你將無需再web.xml里配置如此多的東西(當然,也多了許多acegi的配置)。
參考 http://www.ibm.com/developerworks/cn/java/l-j2eeSecurity/
企業級Java安全性——構建安全的J2EE應用