Java EE 6 應用程序安全加強

JEE6在web容器的安全以及Java應用程序開發中的認證和受權方面引入了一些新的安全特性。這些特性在Web層引入了編程式和聲明式的安全加強。html

基於Servlet 3.0規範(JSR 315),Java EE 6 Web應用程序能夠利用新的編程式和聲明式的安全特性,以及此前在EJB 3.x就已引入的安全註解。Web應用程序還可使用基於JSR 196的插件式的認證/受權模塊,這些模塊能夠做爲Servlet容器的一部分。java

Web模塊安全

Web模塊安全的實現包括編程式(使用Http Servlet Request中新加入的安全方法)和聲明式(使用新的安全註解)。web

編程式安全

可使用HTTP Servlet Request中新加入的方法以編程的方式訪問容器上下文。Servlet 3.0規範在HttpServletRequest接口中定義了以下方法,這些方法能夠在Web應用中認證用戶的身份。編程

  • authenticate:這個方法使用ServletContext上配置的容器登陸機制認證用戶請求。此方法能夠修改並提交HttpServletResponse。若是應用配置了基本類型的身份認證就會彈出一個登陸對話框,收集用戶名和密碼並進行認證。
  • login:login方法在Web容器所使用的安全域(realm)中驗證用戶名和密碼。應用程序可使用該方法獲取用戶名和密碼信息,這樣除了在應用程序的部署描述符中指定基於表單的認證方式外,還能夠編程的方式進行控制。
  • logout:Web應用程序可使用該方法重置請求者的身份信息,若是在同一個請求中調用了getUserPrincipal、getRemoteUser和getAuthType等方法,那麼它會將這些方法的返回值設爲null。

HttpServletRequest接口的以下方法也能夠訪問組件調用者的安全信息:api

  • getRemoteUser:此方法能夠獲取客戶端經過認證的用戶名。此方法返回遠程用戶(已經由容器將其與請求關聯在一塊兒)的名字。若是沒有用戶經過身份認證,則返回null。
  • isUserInRole:此方法斷定遠程用戶是否具備特定的安全角色。若是沒有用戶經過身份認證,則返回false。此方法接受一個用戶角色名的字符串參數。應該在部署描述符中聲明security-role-ref元素,其子元素role-name包含了傳遞給方法的角色名。
  • getUserPrincipal:getUserPrinicipal方法用來判斷當前用戶的principal名,並返回一個java.security.Principal對象。若是沒有用戶經過身份認證,則返回null。調用getUserPrincipal返回的Principal對象的getName方法會返回遠程用戶名。

聲明式安全

新的註解也能夠用來加強Web模塊的安全性。咱們能夠經過Java EE 6提供的註解和部署描述符進行認證、受權及傳輸層加密。Java EE 6的新註解列舉以下:數組

  • @ServletSecurity:@ServletSecurity可用於Servlet的實現類,指定Servlet容器對HTTP協議報文進行驗證的安全約束。Servlet容器會對匹配的Servlet所對應的url-patterns施加這些約束。
  • @HttpMethodConstraint:@HttpMethodConstraint用在@ServletSecurity註解的內部,表述了加於特定HTTP協議報文之上的安全約束。這是一個數組,指定了HTTP方法的具體約束。
  • @HttpConstraint:該註解用在@ServletSecurity註解的內部,表述了針對全部HTTP方法(除了在ServletSecurity註解的內部已經指定了對應的HttpMethodConstraint元素)進行防禦的安全約束。
  • @DeclareRoles:@DeclareRoles是一個類級別的註解,這是Common Annotations 1.0(JSR 250)規範的一部分,它與定義應用程序所使用角色的security-role元素的效果相仿。它應該先於其餘引用具體角色的地方進行定義。
  • @RunAs:@RunAs註解也是Commons Annotations 1.0的一部分,用來規定特殊組件的run-as角色。你能夠規定是應該使用調用者的安全標識,仍是應該使用一個特定的run-as標識來執行企業bean的特定方法。這個註解也是類級別的註解。

若是Web應用程序由Servlet組成,在@ServletSecurity註解的內部使用@HttpConstraint註解和@HttpMethodConstraint註解(在某些狀況下)來規定應用程序的安全約束便可。對於其餘的Web應用程序,請在部署描述符裏面使用security-constraint元素來規定應用程序的安全約束。安全

聲明安全角色

安全角色(security role)的名稱可使用部署描述符的security-role元素來聲明。安全角色引用(security role reference)定義了Web組件在調用isUserInRole(String role)方法時須要使用的角色名稱與針對應用程序定義的安全角色名稱之間的映射。例如,要把安全角色引用「cut」與角色名稱爲「bankCustomer」的安全角色映射起來,語法以下:oracle

<servlet> ... <security-role-ref> <role-name>cust</role-name> <role-link>bankCustomer</role-link> </security-role-ref> ... </servlet>

若是屬於「bankCustomer」安全角色的用戶調用了該servlet,方法isUserInRole("cust")將返回true。security-role-ref元素中的role-link元素必須與在處於同一份web.xml部署描述符中的security-role元素所定義的role-name一致。java-ee

<security-role> <role-name>bankCustomer</role-name> </security-role> 

強制傳輸安全

傳輸安全確保了沒有人能夠篡改服務端發到客戶端或者從客戶端接收的數據。Java EE規範讓開發人員可以經過web.xml文件中的「用戶數據約束(user data constraint)」和「傳輸保證(transport guarantee)」元素,或者@HttpConstraint註解的「transportGuarantee」屬性,來強制傳輸的安全性。用戶數據約束(user data constraint)知足了受限的請求應該經由受防禦的傳輸層連接進行傳輸的需求。必需的防禦力度是由傳輸保證(transport guarantee)元素的值來定義。如下是在內部類TransportGuarantee中定義的值:jsp

  • CONFIDENTIAL:這個傳輸保證用於知足內容私密性的要求。它確保了數據是加密的,這樣數據就沒法被第三方破譯。
  • NONE:這一級別的傳輸保證不使用SSL,容許數據照常傳輸。它表示容器在接收到任意的鏈接(包含未防禦的鏈接)時,必須接受被約束的請求。

咱們能夠經過使用「user-data-constraint"元素(這個元素應該放在包含了須要傳輸層保護的資源的security-constraint標籤的內部),在web.xml中加上傳輸層的安全性。例如,咱們能夠在security-constraint的內部加上以下代碼片斷,這樣當用戶訪問受管資源時,將會被強制使用SSL。

<user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> 

欲瞭解更多關於Java EE 6的安全特性,不妨去看看Servlet 3.0規範文檔中的「安全」章節(第13章)和Java EE 6教程( 第24章 )。 DZone最近也在Java EE加強的安全特性方面發表了一篇參考文檔(reference card)(提示:用戶須要先註冊,才能從他們的網站下載文件)。

相關文章
相關標籤/搜索