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:概述相关推荐
- java ee 8 api_Java EE 8安全性API:概述
java ee 8 api 新的安全性API Java EE 8中添加的最重要的一项新功能可能就是新的安全性API. 此新API的主要动机是简化,标准化和现代化跨容器和实现处理安全性问题的方式. 他们 ...
- 使用Java蓝牙无线通讯技术API概述
蓝牙是一种低成本.短距离的无线通信技术.对于那些希望创建个人局域网(pans)的人们来说,蓝牙技术已经越来越流行了.每个个人局域网都在独立设备的周围被动态地创建,并且为蜂窝式电话和pda等设备提供了自 ...
- oidc_使用Java EE和OIDC构建Java REST API
oidc "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. ...
- 使用Java EE和OIDC构建Java REST API
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Java ...
- WildFly上具有AngularJS的Java EE 7和Java WebSocket API(JSR 356)
这篇博客文章描述了用于WebSocket协议的Java API(JSR 356) (这是Java EE 7平台的四个最新JSR之一),并提供了部署在WildFly 8上并可以在OpenShift上在线 ...
- java 程序增加 防盗_防盗Java EE –保护Java EE企业应用程序的安全
java 程序增加 防盗 Øredev离我们仅有几天的路程,我受邀作了两次演讲. 其中之一是关于我最喜欢的主题:安全性和Java EE. 它旨在实现两个目标. 一方面向典型的Java EE开发人员介绍 ...
- 防盗Java EE –保护您的Java EE企业应用程序
Øredev离我们仅有几天的路程,我受邀作了两次演讲. 其中之一是关于我最喜欢的主题:安全性和Java EE. 它旨在实现两个目标. 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要 ...
- Java EE启示录
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓"启示录",就是这个意思. 一 ...
- java ee打印功能_Java EE:异步构造和功能
java ee打印功能 介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B ( ...
最新文章
- spring 托管bean_在非托管对象中使用Spring托管Bean
- java中一些入门级技巧
- ANT 运行jar包的中文乱码问题
- uva 1557 - Calendar Game(博弈)
- 虚拟化精华问答 | 如何为虚拟机分配任务?
- 天天向上续python3.3_Linux 配置系列 四 python3
- MySQL如何创建沙箱,沙箱环境搭建 - osc_y8w65yuq的个人空间 - OSCHINA - 中文开源技术交流社区...
- 数据智能知多少?(超大礼包等你拿)
- 并查集:POJ No1703 Find them, Catch them
- 全新Linux+Python高端运维班第一次作业
- tp5 查询求和_TP5 Or查询的几种方法
- 考研计算机专业课复试都有什么,2019计算机考研复试科目总结
- cnn风格迁移_CNN图像风格迁移的原理及TensorFlow实现
- 用数据分析看共享单车
- lumion无法隐藏活动层_lumion是什么软件?想快速掌握 Lumion?快来拿走这份正确的入门教程!...
- 手把手教你入门Hadoop(附代码资源)
- 一加手机android auto,一加手机怎么升级安卓5.0系统
- burpsuit无法抓包
- 路由守卫(全局守卫,局部守卫,组件内守卫)
- 免安装Oracle客户端使用PL/SQL连接Oracle的方法
热门文章
- SDOI2018 物理实验
- maven中scope属性的
- javaweb项目搭建ehcache缓存系统
- Failed to load http://localhost:3000/products: The 'Access-Control-Allow-Origin' header has a value
- 祝张远远和杨凯博同学生日快乐 | 班级日常分享
- java实现打印菱形
- Ajax判断用户名是否可用
- Linux ss 热点,在Linux系统下的ss命令(socket statistics)各种使用示例
- 神经网络中的最小二乘_深度神经网络:噪声中解读出科学
- kafka 学习 非常详细的经典教程