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