《Java EE 7精粹》—— 2.7 安全

2.7 安全

Servlet通常通过互联网访问,因此其安全需求是通用的。可以使用注解或在web.xml中指定Servlet的安全模型,包括角色、访问控制和认证要求。

@ServletSecurity注解用于指定Servlet的实现类的所有方法或特定的doXXX()方法的安全约束。容器将强制执行相应的doXXX()消息只能由指定角色的用户调用:

在这段代码中,@HttpMethodConstraint注解用于指定doGet()方法可以由R2角色的用户调用,doPost()方法可以由R3和R4角色的用户调用。在@HttpConstraint注解用于指定所有其他方法可以由R1角色的用户调用。角色被映射到安全主体或容器组中。

安全约束也可以在web.xml中的元素中指定。在中,元素用于指定HTTP操作和网络资源的约束,元素用于指定允许访问该资源的角色,元素在其子元素中表明客户端和服务器之间的数据应该以何种方式加以保护:

这个部署描述符只要求/account/*路径下的GET方法是被保护的。该方法只能由manager角色的用户访问,数据传输的约束是INTEGRITY。除了GET方法,其他的所有HTTP方法是不受保护的。

如果HTTP方法没有在security-constraint中列举,由约束定义的保护适用于全部的HTTP(扩展)方法:

在这段代码中,所有的HTTP方法在/account/*路径下都受保护。

当中至少列出一个元素时,没有在该中列出的HTTP协议方法在Servlet 3.1中被定义为未保障的(uncovered):

在这个代码片段中,只有HTTP GET方法是受保护的,而所有其他的HTTP协议方法,如POST和PUT是未保障的。

元素用于指定不受约束保护的HTTP方法清单:

在这段代码中,只有HTTP GET方法是不受保护的,而所有其他的HTTP协议方法受保护。

元素,是Servlet 3.1中的新元素,用于拒绝对未保障的HTTP方法的HTTP方法请求。被拒绝的请求返回一个403(SC_FORBIDDEN)状态码:

在这段代码中,元素确保HTTP GET调用时所需的安全认证,而所有其他的HTTP方法被拒绝,HTTP状态码为403。

@RolesAllowed注解、@DenyAll注解、@PermitAll和@TransportProtected注解提供了另一种为特定的资源或资源方法指定安全角色的方式:

如果注解在类和方法两个级别指定,在该方法中指定的注解覆盖在类中指定的。

Servlet 3.1引入了以下两个新的预定义角色。

    • 匹配任意已定义的角色。
  • ** 匹配任意认证用户的独立角色。
    相比在一个特定的角色上指定而言,这使得可以在一个更高的层次上指定安全约束。

最多可以在目标上指定一个@RolesAllowed、@DenyAll或者@PermitAll注解。@TransportProtected注解可以和@RolesAllowed或@PermitAll注解组合使用。

Servlet可以配置为HTTP基本认证、HTTP摘要认证、HTTPS客户端,以及基于表单的认证:

这段代码显示了如何实现基于表单的身份验证。登录表单必须包含输入用户名和密码字段,字段必须分别命名为j_username和j_password。表单的action总是命名为j_security_check。

Servlet的3.1要求密码表单字段的属性autocomplete="off",进一步加强基于Servlet表单的安全性。

HttpServletRequest还提供了编程式的安全方法login()、logout()和authenticate()。

login()方法验证在密码验证领域(具体到一个容器)中提供为ServletContext配置的用户名和密码。这确保了getUserPrincipal()方法、getRemoteUser()方法和getAuthType()方法的返回值有效。login()方法可以作为基于表单登录的替代方法。

authenticate()方法使用为ServletContext配置的容器登录机制来验证当前请求的用户。

时间: 2024-09-20 16:45:56

《Java EE 7精粹》—— 2.7 安全的相关文章

《Java EE 7精粹》—— 导读

前言 Java EE 7平台建立在以前的版本之上,侧重于提高生产力和拥抱HTML5.本书面向的是想快速概览这个平台和回来复习基础知识的读者. 本书提供了Java EE 7平台中关键规范的概述(每章一个规范).本书绝不是一本介绍不同规范中每一个概念的详尽指南或教程,而是通过简单的代码示例来解释不同规范的主要概念.阅读本书,无需具备Java EE平台早期版本的知识,但你需要对Java有一些基本了解,以便理解代码. 这本书的重要部分来自<Java EE 6 Pocket Guide>(O'Reill

《Java EE 7精粹》—— 1.2 可交付成果

1.2 可交付成果 Java EE 7平台是遵从JCP 2.9作为JSR 342而开发的.JCP过程对每一个JSR定义了以下三个主要可交付成果. 1.2.1 规范(Specification) 描述了被提议的组件及其功能的一份正式的文件. 1.2.2 参考实现(RI) 对被提议的规范的二进制实现.参考实现有助于确保被提议的规范能以一个二进制形式实现,并为规范过程提供不断的反馈. Java EE的参考实现建立在GlassFish社区中. 1.2.3 技术兼容包(TCK) 用于验证参考实现是否符合被

《Java EE 7精粹》—— 第3章 JSF 3.1 Facelets

第3章 JSF JSF是基于Java的Web应用程序开发的服务器端用户界面(UI)框架.使用JSF可以实现: 使用遵循模型-视图-控制器(MVC)设计模式的可重用的UI组件集合来创建网页. 绑定组件到服务器端模型,允许UI与应用程序数据双向移动. 处理UI事件响应和模型交互中的页面导航. 管理跨服务器请求的UI组件状态. 提供从客户端生成的事件到服务器端应用程序代码的简单模型. 轻松地构建和重用自定义UI组件. JSF应用程序包括: 置于UI组件的布局中的一组网页. 一组托管的Bean,包括绑定

《Java EE 7精粹》—— 3.5 Ajax

3.5 Ajax JSF原生支持添加Ajax功能到网页.JSF允许局部视图的处理,其中只有视图中的一些组件用于处理该响应.JSF可以摘选页面上的某些组件,渲染局部页面,而不是整个页面. 有以下两种方法可以启用这种支持. 以编程方式使用JavaScript资源. 以声明的方式使用f:ajax组件. 编程方式的Ajax集成是通过资源处理机制启用的.jsf.js是在javax.faces库中预定义的资源.该资源包含用于Ajax和JSF页面交互的JavaScript API.可以在页面中使用output

《Java EE 7精粹》—— 3.3 复合组件

3.3 复合组件 JSF使用Facelets的功能和资源的处理来定义复合组件,定义在Facelets标记文件中的一个或多个JSF组件组成了一个复合组件.这个.xhtml文件存储在资源库中,可以从页面的任意区域创建一个可重用的组件. 复合组件在定义页面中定义,在使用页面中使用.定义页面使用定义元数据(或参数),使用<cc:implementation>定义实现,其中cc是http://xmlns.jcp.org/jsf/composite/命名空间的前缀.JSF规范的未来版本可能会放宽对指定元数

《Java EE 7精粹》—— 2.6 Web Fragment

2.6 Web Fragment 包含在库或框架JAR包的META-INF目录中的一个web fragment片段是部分或全部在web.xml文件中.如果这个框架绑定在WEB-INF/lib目录中,容器会选择和配置框架,而无需开发人员显示地做到这一点. Web Fragment可以包括几乎所有web.xml中指定的元素.然而,其顶级元素必须是web-fragment,并且相应的文件必须命名为webfragment.xml.这将允许Web应用程序逻辑分区: 开发人员可以指定在web.xml和web

《Java EE 7精粹》—— 2.3 事件监听器

2.3 事件监听器 事件监听器提供对ServletContext.HttpSession和ServletRequest对象生命周期的回调事件.这些监听器实现了支持上述对象状态变化事件通知的接口类.每个类可以通过@WebListener注解定义或者在web.xml中声明,抑或通过ServletContext. addListener()方法注册.一个典型的监听器例子是以编程方式注册一个额外的Servlet而没有明确要求程序员这样做,或者应用程序级别的数据库连接的初始化和恢复. 可以有多个监听器类来

《Java EE 7精粹》—— 2.10 Handling Multipart Requests

2.10 Handling Multipart Requests 可以在Servlet中定义@MultipartConfig注解,表示它期待的请求类型是multipart/form-data.HttpServletRequest.getParts()方法和HttpServletRequest.getPart()方法提供multipart请求的各个部分: 在这段代码中: @MultipartConfig注解定义在类上,表明doPost()方法将接收multipart/form-data类型的请求.

《Java EE 7精粹》—— 2.11 Upgrade Processing

2.11 Upgrade Processing HTTP 1.1(RFC 2616)第14.42节定义的升级机制,允许从HTTP 1.1过渡到一些其他的.不兼容的协议.协议变更后的应用层通信的功能和性质是完全依赖于所选择的新的协议.在客户端和服务器之间协商升级后,后续请求使用新选择的协议交换消息.一个典型的例子是RFC 6455的Opening Handshake一节中描述的如何从HTTP协议升级到WebSocket协议. Servlet容器提供了一个HTTP升级机制.然而,Servlet容器本

《Java EE 7精粹》—— 3.12 Passthrough属性和HTML5友好的标记

3.12 Passthrough属性和HTML5友好的标记 HTML5为现有的HTML元素增加了一系列的新属性.这些属性包括input元素的type属性,可以支持例如电子邮件.网址.电话.数量.范围和日期类型的值: 这段代码可以让浏览器检查输入的文字是否为电子邮件格式. 此外,自定义数据属性,也被称为data-*属性,可以被定义为存储页面或应用程序私有的自定义数据.每个HTML元素可能有指定的任意数量.任何值的自定义数据属性: 这段代码引入了数据长度data-length为自定义数据属性. 这些