`
cucaracha
  • 浏览: 138206 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:86092
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:35791
社区版块
存档分类
最新评论

[Java EE 7] Servlet 安全机制

 
阅读更多
一般说来,servlet 会部署到 internet 上,因此需要一些安全性的考虑。你可以制定 servlet 的安全模式,例如角色、访问控制、鉴权等。这些都可以用 annotation 或 web.xml 进行配置。

@ServletSecurity 定义了安全约束,它可以添加在 servlet 实现类上,这样对 servlet 中的所有方法都生效,也可以单独添加在某个 doXXX 方法上,这样只针对这个方法有效。容器会强制调整 doXXX 方法被指定角色的用户调用:

@WebServlet("/account")
@ServletSecurity(
  value=@HttpConstraint(rolesAllowed = {"R1"}),
  httpMethodConstraints={
    @HttpMethodConstraint(value="GET", 
                          rolesAllowed="R2"),
    @HttpMethodConstraint(value="POST", 
                          rolesAllowed={"R3", "R4"})
  }
)
public class AccountServlet 
             extends javax.servlet.http.HttpServlet {
  //. . .
}


在上面的代码段中,@HttpMethodConstraint 定义了 doGet 方法只能被角色为 R2 的用户调用,doPost 方法只能被角色为 R3 或 R4 的用户调用。@HttpConstraint 定义了其它的所有方法都能被角色为 R1 的用户调用。角色与用户映射容器的角色和用户。

安全约束也可以使用 web.xml 中的 <security-constraint> 元素来定义。在这个元素中,使用 <web-resource-collection> 元素来指定 HTTP 操作和 web 资源, 元素     <auth-constraint> 用来指定可以访问资源的角色,<user-data-constraint> 元素中使用 <transport-guarantee> 元素来指定客户端和服务器端的数据应该怎样被保护:

<security-constraint>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>

  <auth-constraint>
    <role-name>manager</role-name>
  </auth-constraint>

  <user-data-constraint>
    <transport-guarantee>INTEGRITY</transport-guarantee>
  </user-data-constraint>
</security-constraint>


上面这段部署描述符表示:在 /account/* URL 上使用 GET 请求将会受到保护,访问的用户必须是 manager 角色,并且需要数据完整性。所有 GET 之外的其它 HTTP 请求都不会受到保护。 如果在 <security-constraint> 中没有明确指定 HTTP 方法的约束,那么默认所有的 HTTP 方法都会受到保护:

<security-constraint>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
  </web-resource-collection>

  . . .
</security-constraint>


上面这段配置表示所有访问 /account/* URL 的 HTTP 方法都将受到保护。

从 Servlet 3.1 开始,规定了没有列入 <security-constraint> 中的 HTTP 方法称为“未被覆盖的方法”(uncovered,意思是在 security-constraint 中没有覆盖到此方法),并且在 <security-constraint> 中至少需要指定一个 <http-method> 元素:

<security-constraint>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  . . .
</security-constraint>


上面的配置中,只有 GET 方法会受到保护,所有其它的 HTTP 方法,比如 PUT、POST 都是“未被覆盖的方法”。

在 <http-method-omission> 元素中可以指定哪些 HTTP 方法不受保护:

<security-constraint>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
    <http-method-omission>GET</http-method-omission>
  </web-resource-collection>

  . . .
</security-constraint>


在上面的例子中,只有 HTTP GET 方法将不受保护,其它的 HTTP 方法将会受到保护。

<deny-uncovered-http-methods> 元素是 Servlet 3.1 中新增加的元素,用于阻止使用“未被覆盖的方法”进行访问。如果使用这个被阻止的 HTTP 方法进行访问,那么将会收到 403(SC_FORBIDDEN)错误状态码:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
           http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <deny-uncovered-http-methods/>
  <web-resource-collection>
    <url-pattern>/account/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  . . .
</web-app>


在上面的例子中,除了 HTTP GET 方法可以安全访问之外,其它所有的 HTTP 方法访问将会返回 403 错误码。

@RolesAllowed、@DenyAll、@PermitAll、和 @TransportProtected是用来进行安全配置的 Annotation:

@RolesAllowed("R2")
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
  //. . .
}


如果同样的 annotation 被添加到类和方法上,那么方法级别的配置将覆盖类级别的配置。

Servlet 3.1 包含了两个预定义的角色:

    * - 表示任意已定义的角色
    ** - 表示某个角色下的任意认证用户

这将允许你在更高的级别设置安全约束,而不仅仅只是针对某个角色。

同一个声明上,最多只能使用一个 @RolesAllowed、@DenyAll 或 @PermitAll 注释。@TransportProtected 可以和 @RolesAllowed 或 @PermitAll 进行组合。

可以将 Servlet 进行配置与基本 HTTP,HTTP Digest,HTTPS 客户端、或 form 表单进行权限认证。

<form method="POST" action="j_security_check">
  <input type="text" name="j_username">
  <input type="password" name="j_password" autocomplete="off">
  <input type="button" value="submit">
</form>


上面的例子演示了如何使用 form-based 的方法进行验证。登陆表单必须包含用户名和密码,并且用户名和密码字段的名称必须分别是“j_username”和“j_password”,form 表单提交的 action 必须是 “j_security_check”。

Servlet 3.1 需要在密码字段上添加 autocomplete="off",用于进一步加强 form 表单的安全性。

HttpServletRequest 也提供了 login、logout 和 authenticate 方法,方便使用编码的方式来进行权限验证。

login() 方法将验证用户名和密码是否匹配在 ServletContext 中的配置(依赖 web 容器进行配置)的用户名密码。这将保证 getUserPrincipal、getRemoteUser、和 getAuthType 返回正确的值,使用 HttpServletRequest 提供的 login 方法可以取代上面使用的 form-based 验证。

authenticate() 方法将使用 ServletContext 的容器登陆机制来验证用户发起的这次请求。

文章来源:http://www.aptusource.org/2014/04/java-ee-7-servlet-security/
0
0
分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    java项目源码之基于jsp+servlet+javaBean实现MVC_jspmvc的实现.rar

    Java EE 标准:基于 Java EE 技术栈开发,兼容各种 Java Web 容器,如 Apache Tomcat、Jetty 等。 JSPMVC 框架通过有效地将应用程序的不同层次分离,使得开发人员能够更加专注于业务逻辑的实现,提高了开发效率和...

    计算机毕业设计-JAVA3D的网络三维技术的设计与实现(源代码+论文+说明)

    实现时,服务器可能使用Java Servlet或Java EE技术来搭建,处理来自客户端的请求,如加载模型、场景切换和用户操作。客户端则利用Java 3D提供的工具和类库来构建虚拟世界,实现用户界面和三维图形的实时渲染。 网络...

    java项目源码之订销管理系统的实现.rar

    Java EE 技术栈:采用 Java EE 技术栈进行开发,包括 Servlet、JSP、JDBC 等,构建稳定可靠的企业级应用。 数据库支持:使用关系型数据库(如MySQL、Oracle等)存储数据,通过 JDBC 进行数据访问和管理。 前端技术...

    java项目源码之企业进销存管理系统的实现.rar

    Java EE 技术栈:采用 Java EE 技术栈进行开发,包括 Servlet、JSP、JDBC 等,构建稳定可靠的企业级应用。 数据库支持:使用关系型数据库(如 MySQL、Oracle 等)存储数据,通过 JDBC 进行数据访问和管理。 前端...

    JAVA程序开发大全---上半部分

    第15章 Java EE中EJB的开发 256 15.1 EJB概述 256 15.2 WebLogic服务器的安装与配置 257 15.2.1 WebLogic服务器的安装 257 15.2.2 WebLogic服务器的配置 258 15.2.3 MyEclipse中集成WebLogic服务器 260 15.3 使用...

    J2EE应用开发详解

    第1章 Java Web应用开发简介 1 1.1 Java EE应用概述 1 1.2 Java EE概念 1 1.2.1 Java EE多层模型 1 1.2.2 Java EE体系结构 2 1.3 Java EE的核心API与组件 4 1.4 Web服务器和应用服务器 13 1.5 小结 16 第2章 建立...

    java程序设计与开发课件

    1.5.4 Java程序的编写···························· (7) 1.6 本章小结································· (9) 习题1···············...

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一 个gzip缓存servlet过滤器,支持REST和SOAP api等特点。MapDB: mapdb是一个内嵌的纯java的数据库,提供了...

    spring security 参考手册中文版

    28.2.2 Java EE容器认证 220 29. LDAP认证 220 29.1概述 220 29.2在Spring Security中使用LDAP 221 29.3配置LDAP服务器 221 29.3.1使用嵌入式测试服务器 222 29.3.2使用绑定认证 222 29.3.3加载权限 223 29.4实现类 ...

    j2ee应用服务器和web服务器解析.docx

    然而,Tomcat并不仅仅如此,它还提供了JNDI和JMXAPI的实现机制。尽管如此,Tomcat仍然还不能算是应用服务器,因为它不提供大多数J2EEAPI的支持。 很有意思的是,目前许多的应用服务器通常把Tomcat作为它们Servlet和...

    struts 2 权威指南

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或初步Java EE编程基础的读者。本书由浅入深、全面深入地介绍了Struts 2框架各方面的内容,既可以作为普通学习者学习Struts 2的教材,也可以作为...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    J2EE组件间共享对象技术

    想要用好Struts应用框架,必须了解J2EEWeb级JSP和Servlet技术存放共享对象的几种方式。同时,要利用J2EE开发Web应用程序也必须掌握组件间对象共享的机制。像Java程序有类级别变量、方法级别变量一样,J2EEWeb应用...

    Python编程入门经典

    Java EE servlet 477 21.7.4 选择Jython开发工具 483 21.8 使用Jython进行测试 483 21.9 嵌入Jython解释器 484 21.10 处理C-Python和Jython 之间的差异 487 21.11 本章小结 488 21.12 习题 488 第Ⅳ部分 附 录 附录A...

    javaee视频.zip

    8.Servleti置版流程raI 9ava开发环蟯ra 10简单程序和程图.ran 11变星和基础数据类型.ra 12运算符和表达式ra 13.流程控制rar 14数组.rar 15方法rar 16面向对象rar 17类和对象rar 18重载+this+构造rar 19内存管理+参数...

    Struts2属性文件详解

    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题.该属性的默认值是false.对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true. struts....

Global site tag (gtag.js) - Google Analytics