阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

谈一谈Java的网络编程

CodeWithBuff

Java 网络io

密码学系列之:twofish对称密钥分组算法

程序那些事

加密解密 密码学 程序那些事

【源码篇】Flutter Provider的另一面(万字图文+插件)

小呆呆666

flutter ios android 大前端

【源码篇】Flutter Bloc背后的思想,一篇纠结的文章

小呆呆666

flutter ios android 大前端

详解Redis主从复制原理

蘑菇睡不着

Java redis

Rust从0到1-函数式编程-迭代器

rust 函数式编程 Iterator 迭代器

趣谈Java类加载器

程序猿阿星

Java ClassLoader 类加载器

领域驱动设计101 - 模块

luojiahu

领域驱动设计 DDD

我是如何用 ThreadLocal 虐面试官的?

陈皮的JavaLib

Java 面试 多线程 ThreadLocal

ZooKeeper实战

CodeWithBuff

Java zookeeper

Linux之less命令

入门小站

Linux

成为你想要看到的改变,首先就是让正确的事情持续的发生。

叶小鍵

毕业论文被不小心删除了,有什么方法可以恢复?

淋雨

EasyRecovery 文件恢复 硬盘数据恢复

过一过Java“锁”事

CodeWithBuff

Java 并发 同步

[译] R8 优化: Lambda Groups

Antway

6月日更

react native实践总结与思考

碗盆

android 跨平台 React Native

迪士尼将亚马逊云科技作为首选的公有云基础设施供应商,支持 Disney+ 全球扩展

亚马逊云科技 (Amazon Web Services)

lockSupport怎么玩

卢卡多多

锁机制 6月日更

研发管理工具 ONES 完成3亿人民币 B1 B2 轮融资,继续领跑研发管理赛道

万事ONES

项目管理 融资 研发管理工具 ONES

德勤基于Amazon WAF 云原生安全服务为客户交付价值

亚马逊云科技 (Amazon Web Services)

如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)

看山

Java 并发编程

建信金科大咖访谈:地方特色产业互联网建设思考与实践

金科优源汇

百度关于EMP的探索:落地生产可用的微前端架构

百度Geek说

ONLYOFFICE-基本组成及工作原理

一个需求

onlyoffice

Dapr:我不是Service Mesh!我只是长得很像

中原银行

云原生 Service Mesh istio Multi-Architecture dapr

「2021中国峰会同行记」第二回 | 探索店匠从0到1出海的技术密码

亚马逊云科技 (Amazon Web Services)

人工智能应用架构的思考

金科优源汇

三个维度,透视5G价值的持续点亮之旅

脑极体

python 连接钉钉传输工作数据监控

百里丶落云

数据结构——顺序栈

若尘

数据结构 6月日更

推荐一个MySQL宝藏网站

Simon

MySQL 网站

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