写点什么

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

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

关注

评论

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

从对象内存布局了解锁的膨胀

Ayue、

锁升级

如何做一个区块链浏览器

Rayjun

区块链 区块链浏览器

作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业业作业作业作业作业作业作业作业作业作业作业作业作业作业

AUV

「架构实战营」

学习总结 2021.12.19

mj4ever

学习笔记

给弟弟的信第17封|拒绝自我感觉良好

大菠萝

28天写作

MQTT X v1.7.0 正式发布:MQTT 5.0 支持最为完整的客户端工具

EMQ映云科技

物联网 IoT mqtt

圣诞节快到了,何不送给Ta一份程序员的浪漫

海拥(haiyong.site)

前端 代码中的浪漫 圣诞节 28天写作 12月日更

🏆【Alibaba中间件技术系列】「EasyExcel实战案例」实战研究一下EasyExcel如何从指定文件位置进行读取数据

码界西柚

EasyExcel Apache POI Alibaba 12月日更

ArgoCD 简明教程

Se7en

架构实战模块二作业

青青子衿

-exec rm 与 xargs rm -rf 深度剖析

liuzhen007

28天写作 12月日更

模块7学习总结

Geek_1d37ea

架构实战营

架构训练营 - 模块二作业

伊静西蒙

王者荣耀商城异地多活架构设计

奔奔

轻松容器化golang应用程序

xcbeyond

golang Docker 28天写作 12月日更

模块三作业

Vincent

「架构实战营」

在不丢失数据的情况下处理屏幕旋转 - Android

坚果

android 28天写作 12月日更

事业的智囊团,精神的后花园(19/28)

赵新龙

28天写作

Linux之cat命令

入门小站

Linux

微信朋友圈高性能架构

Only

架构实战营 「架构实战营」

架构实战营模块2课后作业

墨宝

项目已成为组织发展的必要手段、企业成长的发动机

Seven的代码实验室

项目管理

服务端质量保证体系(四) 测试环境治理

homber

服务端 质量保证 测试环境 签约计划第二季

别做消费主义的祭品

mtfelix

架构实战营模块二作业

zhongwy

架构实战营 「架构实战营」

模块7作业

Geek_1d37ea

架构实战营

JavaScript 数组方法 .map() 的 5 个使用场景

devpoint

JavaScript map array 12月日更

实用机器学习笔记十八:过、欠拟合

打工人!

机器学习 深度学习 算法 学习笔记 12月日更

第二周作业

cqyanbo

架构实战营模块二作业

lchx08

「架构实战营」

元宇宙

圣迪

区块链 数字孪生 元宇宙 进化的力量 扩展现实

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