【AICon】硅谷视野+中国实践,汇聚全球顶尖技术的 AI 科技盛会 >>> 了解详情
写点什么

Java EE 6:应用程序安全增强

  • 2010-07-16
  • 本文字数:2718 字

    阅读完需:约 9 分钟

JEE6 在 web 容器的安全以及 Java 应用程序开发中的认证和授权方面引入了一些新的安全特性。这些特性在 Web 层引入了编程式和声明式的安全增强。

基于 Servlet 3.0 规范( JSR 315 ),Java EE 6 Web 应用程序可以利用新的编程式和声明式的安全特性,以及此前在 EJB 3.x 就已引入的安全注解。Web 应用程序还可以使用基于 JSR 196 的插件式的认证 / 授权模块,这些模块可以作为 Servlet 容器的一部分。

Web 模块安全

Web 模块安全的实现包括编程式(使用 Http Servlet Request 中新加入的安全方法)和声明式(使用新的安全注解)。

编程式安全

可以使用 HTTP Servlet Request 中新加入的方法以编程的方式访问容器上下文。Servlet 3.0 规范在 HttpServletRequest 接口中定义了如下方法,这些方法可以在 Web 应用中认证用户的身份。

  • authenticate:这个方法使用 ServletContext 上配置的容器登录机制认证用户请求。此方法可以修改并提交 HttpServletResponse。如果应用配置了基本类型的身份认证就会弹出一个登录对话框,收集用户名和密码并进行认证。
  • login:login 方法在 Web 容器所使用的安全域(realm)中验证用户名和密码。应用程序可以使用该方法获取用户名和密码信息,这样除了在应用程序的部署描述符中指定基于表单的认证方式外,还可以编程的方式进行控制。
  • logout:Web 应用程序可以使用该方法重置请求者的身份信息,如果在同一个请求中调用了 getUserPrincipal、getRemoteUser 和 getAuthType 等方法,那么它会将这些方法的返回值设为 null。

HttpServletRequest 接口的如下方法也可以访问组件调用者的安全信息:

  • getRemoteUser:此方法可以获取客户端通过认证的用户名。此方法返回远程用户(已经由容器将其与请求关联在一起)的名字。如果没有用户通过身份认证,则返回 null。
  • isUserInRole:此方法判定远程用户是否具有特定的安全角色。如果没有用户通过身份认证,则返回 false。此方法接受一个用户角色名的字符串参数。应该在部署描述符中声明 security-role-ref 元素,其子元素 role-name 包含了传递给方法的角色名。
  • getUserPrincipal:getUserPrinicipal 方法用来判断当前用户的 principal 名,并返回一个 java.security.Principal 对象。如果没有用户通过身份认证,则返回 null。调用 getUserPrincipal 返回的 Principal 对象的 getName 方法会返回远程用户名。

声明式安全

新的注解也可以用来增强 Web 模块的安全性。我们可以通过 Java EE 6 提供的注解和部署描述符进行认证、授权及传输层加密。Java EE 6 的新注解列举如下:

  • @ServletSecurity: @ServletSecurity 可用于 Servlet 的实现类,指定 Servlet 容器对 HTTP 协议报文进行验证的安全约束。Servlet 容器会对匹配的 Servlet 所对应的 url-patterns 施加这些约束。
  • @HttpMethodConstraint: @HttpMethodConstraint 用在 @ServletSecurity 注解的内部,表述了加于特定 HTTP 协议报文之上的安全约束。这是一个数组,指定了 HTTP 方法的具体约束。
  • @HttpConstraint:注解用在 @ServletSecurity 注解的内部,表述了针对所有 HTTP 方法(除了在 ServletSecurity 注解的内部已经指定了对应的 HttpMethodConstraint 元素)进行防护的安全约束。
  • @DeclareRoles: @DeclareRoles 是一个类级别的注解,这是 Common Annotations 1.0(JSR 250)规范的一部分,它与定义应用程序所使用角色的 security-role 元素的效果相仿。它应该先于其他引用具体角色的地方进行定义。
  • @RunAs: @RunAs 注解也是 Commons Annotations 1.0 的一部分,用来规定特殊组件的 run-as 角色。你可以规定是应该使用调用者的安全标识,还是应该使用一个特定的 run-as 标识来执行企业 bean 的特定方法。这个注解也是类级别的注解。

如果 Web 应用程序由 Servlet 组成,在 @ServletSecurity 注解的内部使用 @HttpConstraint 注解和 @HttpMethodConstraint 注解(在某些情况下)来规定应用程序的安全约束即可。对于其他的 Web 应用程序,请在部署描述符里面使用 security-constraint 元素来规定应用程序的安全约束。

声明安全角色

安全角色(security role)的名称可以使用部署描述符的 security-role 元素来声明。安全角色引用(security role reference)定义了 Web 组件在调用 isUserInRole(String role)方法时需要使用的角色名称与针对应用程序定义的安全角色名称之间的映射。例如,要把安全角色引用“cut”与角色名称为“bankCustomer”的安全角色映射起来,语法如下:

复制代码
<servlet>
...
<security-role-ref>
<role-name>cust</role-name>
<role-link>bankCustomer</role-link>
</security-role-ref>
...
</servlet>

如果属于“bankCustomer”安全角色的用户调用了该 servlet,方法 isUserInRole(“cust”) 将返回 true。security-role-ref 元素中的 role-link 元素必须与在处于同一份 web.xml 部署描述符中的 security-role 元素所定义的 role-name 一致。

复制代码
<security-role>
<role-name>bankCustomer</role-name>
</security-role>

强制传输安全

传输安全确保了没有人可以篡改服务端发到客户端或者从客户端接收的数据。Java EE 规范让开发人员能够通过 web.xml 文件中的“用户数据约束(user data constraint)”和“传输保证(transport guarantee)”元素,或者 @HttpConstraint 注解的“transportGuarantee”属性,来强制传输的安全性。用户数据约束(user data constraint)满足了受限的请求应该经由受防护的传输层链接进行传输的需求。必需的防护力度是由传输保证(transport guarantee)元素的值来定义。以下是在内部类 TransportGuarantee 中定义的值:

  • CONFIDENTIAL:这个传输保证用于满足内容私密性的要求。它确保了数据是加密的,这样数据就无法被第三方破译。
  • NONE:这一级别的传输保证不使用 SSL,允许数据照常传输。它表示容器在接收到任意的连接(包含未防护的连接)时,必须接受被约束的请求。

我们可以通过使用“user-data-constraint"元素(这个元素应该放在包含了需要传输层保护的资源的 security-constraint 标签的内部),在 web.xml 中加上传输层的安全性。例如,我们可以在 security-constraint 的内部加上如下代码片段,这样当用户访问受管资源时,将会被强制使用 SSL。

复制代码
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

欲了解更多关于 Java EE 6 的安全特性,不妨去看看 Servlet 3.0 规范文档中的“安全”章节(第 13 章)和 Java EE 6 教程( 第24 章 )。 DZone 最近也在 Java EE 增强的安全特性方面发表了一篇参考文档(reference card)(提示:用户需要先注册,才能从他们的网站下载文件)。

查看英文原文: Java EE 6: Application Security Enhancements <

2010-07-16 06:492746
用户头像

发布了 76 篇内容, 共 23.4 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

网络安全hw蓝队实战之溯源

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

拒绝繁琐,华为云企业交换机ESW就是要让数据上云一步到位

科技怪授

ica

消失与存续——应用交付行业的跌宕演进

云科通明湖

负载均衡 高可用 云原生 信创

SAP | 如何全局处理消息文本

暮春零贰

SAP 10月月更 动态消息

阿里最新产,SpringCloud微服务核心技术全解手册Github星标50k

程序员小毕

Java 微服务 后端 SpringCloud springcloudAlibaba

SAP | ABAP程序结构中的处理块

暮春零贰

SAP 模块化 10月月更

政务数据安全解决方案

前嗅大数据

政务 基础数据方案 数据方案

千锋沈阳前端怎么样?学员真实案例

千锋IT教育

沉浸其境,共赴云栖数智硬核美学

阿里云视频云

VR/AR 云栖大会 数智融合 超高清视频 云游戏

浅谈长连接负载均衡

捉虫大师

负载均衡 长连接 10月月更

企业上云也可以很智能,智能云接入ICA替企业搭建“上云梯”

科技怪授

ica

极光笔记 | 极光clickhouse千亿级数据分析实践之路

极光JIGUANG

可观测可回溯 | Continuous Profiling 实践解析

阿里巴巴云原生

阿里云 云原生 可观测

华为云智能云接入ICA,让世界距离更近

科技怪授

ica

千锋大连“匠心8载 感谢有你”周年庆典隆重举行

千锋IT教育

想在杭州学前端,千锋IT培训怎么样?学员真实案例

千锋IT教育

云原生颠覆实践,可持续性应用创新引擎

云科通明湖

负载均衡 云原生

【网易云信】Sanitizers 系列之 address sanitizer 用法篇

网易智企

算法 开发语言

信息技术国产化浪潮中,云科通明湖如何助力企业转型蝶变?

云科通明湖

双活 高可用架构 自主可控

首次!龙蜥社区生态用户实践精选集发布在即

OpenAnolis小助手

开源 龙蜥社区 生态伙伴 厂商 案例集

Sanitizers 系列之 address sanitizer 用法篇

网易云信

算法 语言 & 开发

穿越周期性调整 英特尔多举措布局半导体产业

科技之家

关于软件系统的帮助文档页面,你该知道的那些事儿

Baklib

帮助文档

NFT质押挖矿分币系统开发模式定制

开发微hkkf5566

英特尔财报彰显系统级代工渐成气候

科技之家

ALL in ONE!博睿数据隆重举行ONE 2.0全面上线仪式

博睿数据

可观测性 智能运维 博睿数据 ONE平台

可观测实践|如何使用阿里云 Prometheus 观测 ECS 应用

阿里巴巴云原生

阿里云 云原生

企业数据上云,怎能少的了华为云企业交换机ESW?

科技怪授

ESW

颠覆性突破重构企业价值

云科通明湖

负载均衡 云原生

Flink 读写多套 Kerberos 认证的 Kafka 方案

移动云大数据

如何引发一场信创负载均衡领域的大变革?

云科通明湖

负载均衡 信创

Java EE 6:应用程序安全增强_Java_Srini Penchikala_InfoQ精选文章