Java EE 8安全性API:概述
新的安全性API
可能,添加到Java EE 8中最重要的一項新功能就是新的安全性API。
此新API的主要動機是簡化,標準化和現代化跨容器和實現處理安全性問題的方式。 他們做得很好。
- 由于三個新的注釋使web.xml文件聲明變得多余,Web身份驗證的配置已經實現了現代化。
- 新的Security Context API標準化了Servlet和EJB容器執行身份驗證以及
- 新的Identity S 撕裂抽象以簡化身份存儲的使用。
現在,讓我們看看這些新功能中的第一個。
注釋驅動的認證機制
此功能全部與配置Web安全有關。 web.xml文件中需要哪種傳統的XML聲明。
有了HttpAuthenticationMechanism接口,該接口代表HTTP身份驗證,并帶有三個內置的啟用CDI的實現,每個實現都可以表示可配置Web安全的三種方式之一,因此不再需要此操作。
使用這些注釋之一觸發它們。
@BasicAuthenticationMechanismDefinition @FormAuthenticationMechanismDefinition @CustomFormAuthenticationMechanismDefinition它們復制了servlet容器中已經可用的經典HTTP基本身份驗證,表單和基于自定義表單的身份驗證的功能。
例如,要啟用基本身份驗證, 僅需向您的servlet添加BasicAuthenticationMechanismDefinition批注即可。
@BasicAuthenticationMechanismDefinition(realmName="${'user-realm'}") @WebServlet("/user") @DeclareRoles({ "admin", "user", "demo" }) @ServletSecurity(@HttpConstraint(rolesAllowed = "user")) public class UserServlet extends HttpServlet { … }現在,您可以放棄XML配置,并使用這些新注釋之一來提高Web安全性。
安全API的下一個重要功能是身份存儲抽象。
身份存儲抽象
身份存儲是一個數據庫,用于存儲用戶標識數據,例如用戶名,組成員身份以及用于驗證憑據的信息。
新的Java EE安全API提供了一個稱為IdentityStore的身份存儲抽象,該身份存儲抽象用于與身份存儲交互以認證用戶并檢索組成員身份,類似于JAAS LoginModule接口。
HttpAuthenticationMechanism實現旨在使用IdentityStore ,但這不是必需的 。 IdentityStore可以獨立存在,并且可以由應用程序開發人員希望的任何其他身份驗證機制使用。
盡管如此, IdentityStore和HttpAuthenticationMechanism的共同使用使應用程序能夠以可移植的標準方式控制用于身份驗證的身份存儲,這是大多數用例場景的推薦方式。
現在,您可以通過實現IdentityStore接口來實現自己的身份存儲,或者可以將內置的IdentityStore實現之一用于LDAP和關系數據庫。 通過將配置詳細信息傳遞給適當的注釋@LdapIdentityStoreDefinition或@DataBaseIdentityStoreDefinition來初始化它們。
讓我們看一下內置身份存儲的用法。
最簡單的身份存儲是數據庫存儲。 它通過@DataBaseIdentityStoreDefinition批注進行配置,如下所示。
@DatabaseIdentityStoreDefinition(dataSourceLookup = "${'java:global/permissions_db'}",callerQuery = "#{'select password from caller where name = ?'}",groupsQuery = "select group_name from caller_groups where caller_name = ?",hashAlgorithm = PasswordHash.class,priority = 10 ) @ApplicationScoped @Named public class ApplicationConfig { ... }配置選項非常容易解釋,如果您已經配置了數據庫定義,則應該熟悉它們。
但是,請注意將優先級設置為10,在運行時找到多個標識存儲庫并確定相對于其他存儲庫的迭代順序時使用。 數字越小優先級越高。
現在,讓我們看一下安全性API的最終新功能。
安全上下文
安全上下文的目標是在Servlet和EJB容器之間提供對安全上下文的一致訪問。
當前,這些容器不一致地實現了安全上下文對象。 例如,servlet容器提供一個HttpServletRequest實例,在該實例上調用getUserPrincipal()方法以獲得用戶Principal ,而EJB容器提供一個不同名稱的EJBContext實例,在該實例上調用相同的命名方法。 同樣地,以測試用戶是否屬于某個角色的方法isUserRole()調用HttpServletRequest的實例和isCallerInRole()被調用上EJBContext的實例。
SecurityContext在Servlet和EJB容器之間提供一致性,以獲取此類信息。 它有五個方法,沒有一個具有默認實現。
委托人getCallerPrincipal(); 返回表示當前經過身份驗證的用戶名的特定于平臺的主體,如果當前調用方未經過身份驗證,則返回null。
<T擴展Principal> Set <T> getPrincipalsByType(Class <T> pType); 從經過身份驗證的調用者的Subject返回給定類型的所有Principal ,否則,如果未找到pType類型或當前用戶未經過身份驗證,則返回一個空Set 。
boolean isCallerInRole(String role); 確定呼叫者是否包含在指定角色中,否則,如果用戶未被授權,則返回false。
boolean hasAccessToWebResource(String resource,String…方法); 確定調用者是否可以通過提供的方法訪問給定的Web資源。
AuthenticationStatus authenticate(HttpServletRequest req,HttpServletResponse res,AuthenticationParameters param); 通知容器它應該開始或繼續與調用方進行基于HTTP的身份驗證對話。 由于此方法依賴于HttpServletRequest和HttpServletResponse實例,因此只能在servlet容器中使用。
安全上下文是一個CDI bean,因此可以注入到servlet和EJB容器中的任何類中。
@Inject private SecurityContext securityContext;有了SecurityContext實例,您可以調用任何方法來訪問對上下文敏感的安全信息。
boolean hasAccess = securityContext .hasAccessToWebResource("/secretServlet", "GET");現在,結束了對安全性API的概述,對安全性API有更多的了解。
翻譯自: https://www.javacodegeeks.com/2018/04/java-ee-8-security-api-overview.html
總結
以上是生活随笔為你收集整理的Java EE 8安全性API:概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp ddos攻击(Tcp ddos
- 下一篇: linux如何运行c文件(linux如何