安全註釋
註釋是 JSR-175 建議所產生的強大程式設計機制。 註釋是包含受支援安全行為的標準方式,同時容許自動產生原始碼和配置檔。
| 實務 | 規則 |
|---|---|
| 僅限部署描述子中的安全 meta 資料 | 不需要合併,會傳播部署描述子中的安全 meta 資料。 |
| 僅註釋中的安全 meta 資料 | 不需要合併,會傳播以註釋定義的安全 meta 資料。 |
| 部署描述子和註釋中的安全 meta 資料 | 會合併部署描述子和註釋中的 meta 資料。 註釋中的 meta 資料會被部署描述子中相同類型的資料置換。 |
- @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 { …… }