安全註釋

註釋是 JSR-175 建議所產生的強大程式設計機制。 註釋是包含受支援安全行為的標準方式,同時容許自動產生原始碼和配置檔。

在 Java™ Platform, Enterprise Edition (Java EE) 5 以及更新版本中,安全角色和原則可以使用註釋以及在部署描述子內定義。 在應用程式安裝期間,使用註釋所定義的安全原則和角色會與部署描述子內所定義的安全原則和角色合併。 此合併由「註釋 meta 資料管理程式 (AMM)」機能執行。 當合併 meta 資料時,會遵循下列繼承規則。
表 1. meta 資料合併器繼承規則

此表格列出 meta 資料合併器繼承規則。

實務 規則
僅限部署描述子中的安全 meta 資料 不需要合併,會傳播部署描述子中的安全 meta 資料。
僅註釋中的安全 meta 資料 不需要合併,會傳播以註釋定義的安全 meta 資料。
部署描述子和註釋中的安全 meta 資料 會合併部署描述子和註釋中的 meta 資料。 註釋中的 meta 資料會被部署描述子中相同類型的資料置換。
目前支援六個安全註釋。 對於每一個註釋,會定義一個 MergeAction 實作。
  • @DeclareRoles (Servlet 2.5 及以上版本和 EJB 3)

    MergeAction 實作會尋找以 DeclareRoles 註釋標註的所有類別。 在指定的每一個角色名稱的每一個註釋類別內,如果部署描述子中列出的安全角色不包含具有註釋角色名稱的 SecurityRole ,則會建立新的 SecurityRole 並新增至此安全角色清單。

  • @RunAs (Servlet 2.5 及以上版本和 EJB 3)

    MergeAction 實作會尋找具有 RunAs 註釋的所有類別。 對於每一個標註的類別,它會尋找與給定類別相關聯的 Servlet 或 Enterprise Java Bean (EJB)。 然後,它會決定是否在 Servlet 或 EJB 的部署描述子中定義 run-as 元素。 如果找不到,則會建立新的 run-as 元素,並新增至部署描述子。 如果找到 run-as 元素,則會使用這個 run-as 元素,而不是建立新的 run-as 元素。 執行身分註釋中所用的角色名稱必須定義在部署描述子中。

  • @DenyAll (僅限 EJB 3)

    MergeAction 實作會尋找所有標註了 DenyAll 註釋的方法。 對於每一個註解方法,如果方法未包含在已排除方法的部署描述子清單中,且部署描述子中沒有 MethodPermission ,則會建立新的 MethodElement ,並新增至部署描述子中這個已排除方法的清單。

  • @PermitAll (僅限 EJB 3)

    MergeAction 實作會尋找具有 PermitAll 註釋的所有類別和方法。 對於每一個標註的類別,它會尋找與給定類別相關聯的 Enterprise Java Bean (EJB)。 然後,它會在部署描述子中定義給這個 EJB 的所有 MethodPermissions 清單中,搜尋 MethodElements 的子集。 如果 MethodElement 具有萬用字元方法名稱 ("*") 找不到萬用字元方法,且萬用字元方法不存在於已排除的方法清單中,或在具有安全角色的 MethodElements 清單中,會建立新的 MethodPermission 和新的 MethodElement。 新的 MethodPermission 會標示為未勾選,且會新增至部署描述子中的 MethodPermission 清單。 新的 MethodElement 會新增至新建立的未檢查 MethodPermission 的 MethodElement 清單中。 會對所有標註的方法執行類似動作。 方法簽章必須完全符合註解方法的簽章,而不是萬用字元 MethodElement。

  • @RolesAllowed (僅限 EJB 3)

    MergeAction 實作會尋找具有 RolesAllowed 註釋的所有類別和方法。 對於每一個標註的類別,它會尋找與給定類別相關聯的 EJB。 然後,它會在這個 EJB 的部署描述子中所定義的所有 MethodPermissions 清單中,尋找 MethodElements 的子集。 如果 MethodElement 具有萬用字元方法名稱 ("*") 找不到萬用字元方法,且萬用字元方法不存在於已排除的方法清單或未檢查的 MethodElements 清單中,會建立新的 MethodPermission 和 MethodElement。 如果這個 EJB 的 MethodPermission 存在,且其角色與註釋中找到的角色完全相同,則會使用這個 MethodPermission ,而不是建立新的 MethodPermission。 對於註釋中指定的每一個角色名稱,會建立一個新的 SecurityRole ,並新增至 MethodPermission 中的 SecurityRole 清單; 如果 MethodPermission 是新建立的,則會將它新增至部署描述子中的 MethodPermission 清單。 所建立的新 MethodElement 會新增至 MethodPermission 的 MethodElement 清單中。 所有註解方法都已完成類似的處理。 方法簽章必須完全符合註解方法的簽章,而不是萬用字元 MethodElement。 此外,對於註釋中指定的每一個角色名稱,如果安全角色的部署描述子清單不包含具有註釋角色名稱的 SecurityRole ,則也會建立新的 SecurityRole 並新增至此安全角色清單。

  • @ServletSecurity (僅限 Servlet 3.0)
    附註: 此版本 WebSphere® Application Server中新增了 Servlet 3.0 的 ServletSecurity 註釋支援。

    當應用程式部署時, ServletSecurity MergeAction 實作會尋找具有 ServletSecurity 註釋的所有 Servlet。 對於每一個標註的 Servlet ,它會在 WebServlet 註釋上尋找與給定類別庫相關聯的 Servlet。 如果在部署描述子中找不到 ServletSecurity 註釋中的 RolesAllowed ,它會在部署描述子中建立角色的 role-name 屬性。

    當應用程式啟動時, WebContainer 會檢查含有 RunAs、declareRoles 和 ServletSecurity 註釋的所有 Servlet ,並在 ServletRegistration 註釋的 setServletSecurity () 方法上設定那些註釋。 Web 儲存器會通知安全元件檢查具有 URL 型樣和安全限制的所有 ServletRegistration 註釋。 然後安全元件會決定是否在部署描述子中定義 URL 型樣。 如果部署描述子中未定義安全限制和執行身分角色,則會建立並使用 URL 型樣中的安全限制和執行身分角色。 如果部署描述子中已定義完全相符,則會使用部署描述子 URL 型樣中的安全限制和執行身分角色,而不是註釋資料。

    附註: 當 Web 鑑別系統內容 com.ibm.wsspi.security.web.webAuthReq 設為 persisting時,如果提供有效的使用者名稱和密碼,您可以登入不受保護的 URL。

    繼承的 Servlet 註釋是 meta 資料註釋。 請勿在類別中指定繼承的註釋。 如果子類別沒有安全註釋,則會自動從母類別繼承安全註釋。 子類別可以透過指定其安全註釋來改寫母項安全註釋。

    下列範例適用於沒有限制的所有 HTTP 方法:
    @WebServlet ("/Example") 
    @ServletSecurity
    public class Example extends HttpServlet {
           ……
    }
    The following example is for all HTTP methods with no <auth-constraint> element and confidential TransportGuarantee required:
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(transportGuarantee =
                          TransportGuarantee.CONFIDENTIAL))
    public class Example extends HttpServlet { 
           ……
    }
    下列範例適用於所有拒絕存取的 HTTP 方法:
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }
    下列範例適用於所有 HTTP 方法,但不含任何限制的 GET 及 POST 值除外。 For GET, the <auth-constraint> element requires membership in ALL ROLE. 對於 POST ,會拒絕所有存取權。
    @WebServlet (name="Example", urlPatterns={"/Example"}) 
    @ServletSecurity((httpMethodConstraints = {
    	@HttpMethodConstraint(value = "GET", rolesAllowed = “ALL ROLE"),
    	@HttpMethodConstraint(value="POST“, emptyRoleSemantic =
    EmptyRoleSemantic.DENY))
    })
    public class Example extends HttpServlet {
           ……
    }
    The following example is for all HTTP methods except GET, the <auth-constraint> element requires membership in ALL ROLE, and the GET method has no constraints.
    @WebServlet (name="Example", urlPatterns={"/Example"}) 
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    	httpMethodConstraints = @HttpMethodConstraint("GET"))
    public class Example extends HttpServlet {
           ……
    }
    The following example is for all HTTP methods except TRACE, the <auth-constraint> element requires membership in ALL ROLE, and for TRACE, all access is denied.
    @WebServlet (name="Example", urlPatterns={"/Example"})
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    	httpMethodConstraints = @HttpMethodConstraint(value="TRACE",
    	emptyRoleSemantic = EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }