武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

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:492726
用户头像

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

关注

评论

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

详解kubernetes备份恢复利器 Velero | 深入了解Carina系列第三期

BoCloud博云

Kubernetes 云原生 数据备份

SAP Marketing Cloud 功能概述(四)

Jerry Wang

云原生 SaaS SAP 6月月更 Marketing Cloud

《梦华录》要大结局了,看超前点映不如先来学学它!

博文视点Broadview

快手实时数仓保障体系研发实践

Apache Flink

大数据 flink 编程 流计算 实时计算

远程办公之:在家露营办公小工具| 社区征文

甜甜的白桃

初夏征文

SAP Marketing Cloud 功能概述(三)

Jerry Wang

SaaS SAP 云应用 6月月更 Marketing Cloud

leetcode 139. Word Break 单词拆分(中等)

okokabcd

LeetCode 动态规划 算法与数据结构

LRU 原理与算法实现

Ayue、

LRU

青藤入选工信部网安中心“2021年数字技术融合创新应用典型解决方案”

青藤云安全

网络安全 工信部 主机安全

如何在物联网低代码平台中进行任务管理?

AIRIOT

低代码 物联网

一文讲透研发效能!您关心的问题都在 ‍

思码逸研发效能

研发效能

web前端培训怎么修改 node_modules 中的文件

@零度

node.js 前端开发

「开源摘星计划之操作系统100人」发布,共建操作系统开源人才生态

腾源会

初识云原生安全:云时代的最佳保障

SEAL安全

云原生安全

融云通信“三板斧”,“砍”到了银行的心坎上

融云 RongCloud

在 Django 中呈现 HTML 表单(GET 和 POST)

海拥(haiyong.site)

Python django 6月月更

P2PDB 白皮书

Rock-李益

区块链 去中心化数据库

保险APP适老化服务评测分析2022第06期

易观分析

保险APP

java技术培训在 MySQL 中使用枚举需要注意什么

@零度

JAVA开发 枚举

居家办公更要高效-自动化办公完美提升摸鱼时间 | 社区征文

迷彩

Python AI 6月月更 初夏征文 Python自动化办公

保健品一物一码防窜货营销软件开发

开源直播系统源码

软件开发 app源码

初中级开发如何有效减少自身的工作量?

百家饭隐私计算平台创业者

开发 书籍推荐

敏捷之道 | 敏捷开发真的过时了么?

LigaAI

敏捷 敏捷开发 敏捷软件开发 敏捷宣言 LigaAI

知识经济时代,教会你做好知识管理

小炮

钛星数安加入龙蜥社区,共同打造网络安全生态

OpenAnolis小助手

开源 龙蜥社区 合作 CLA 钛星数安

4个不可不知的“安全左移”的理由

SEAL安全

安全左移 shift left

业务与技术双向结合构建银行数据安全管理体系

易观分析

银行数字化

【直播回顾】战码先锋第七期:三方应用开发者如何为开源做贡献

OpenHarmony开发者

OpenHarmony

龙蜥开发者说:首次触电,原来你是这样的龙蜥社区? | 第 8 期

OpenAnolis小助手

Linux 开源 故事 龙蜥社区 开发者说

大数据培训Spark 高频面试考点分享

@零度

spark 大数据开发

AS深圳站来了!参与讨论领取官方限量周边!

InfoQ写作社区官方

热门活动 ArchSummit

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