一般说来,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/
分享到:
相关推荐
- 安全是任何企业级应用不可或缺的一部分,掌握Java EE的安全机制对于保护敏感数据至关重要。 ##### 15. **Java Web Services** - **Java Web Services** 是Java EE中用于构建Web服务的技术集合。 - 本章将介绍...
《Java EE 7 Essentials》是一本详细介绍Java企业版7(Java EE 7)的书籍,涵盖了Java EE 7平台的新特性、组件以及应用场景。Java EE 7是在2013年推出的Java企业级计算平台的标准版本,它在Java EE 6的基础上做了...
Java EE 7(Java Platform, Enterprise Edition 7)是Java平台的一个版本,专注于为企业级应用程序开发提供一组标准的API和服务。这个平台包含了多种组件模型、服务接口和协议,旨在简化开发、部署和管理大型分布式...
Java EE提供了强大的安全机制,包括用户身份验证、授权、加密和安全管理。你将学习如何设置角色、使用JAAS(Java Authentication and Authorization Service)和SSL/TLS进行安全通信。 九、实战项目 教程中的代码...
7. **过滤器**:Servlet Filter是Java EE提供的一种机制,可以在请求到达Servlet之前或之后进行拦截处理,例如实现登录检查、字符编码转换等功能。 8. **监听器**:Servlet监听器可以监听特定事件,如会话创建、...
Java EE提供了多种机制和API来帮助开发者实现安全的Web应用,包括用户身份验证、授权和数据保护。 9. ***ernment Rights**:文档提到,如果这份软件或文档是提供给美国政府或代表其采购,那么它将是“商业计算机...
Java EE 提供了一系列的安全机制,包括身份验证、授权、加密、数字签名等。安全性是保护企业级应用程序的关键。 国际化 国际化是指使应用程序能够适应不同语言、文化和地区的需求。Java EE 提供了一系列的国际化...
Java EE 7作为该平台的一个重要版本,发布于2013年,引入了一系列新特性以提升开发效率和应用性能。 在Java EE 7中,主要包含以下几个关键组件和技术: 1. **Servlet 3.1**:这是用于处理HTTP请求的核心技术,新...
Java EE API包含了一系列的组件和接口,这些组件和接口用于实现诸如Web服务、事务管理、安全控制、数据库连接、邮件服务、会话管理等功能。以下是一些主要的Java EE API及其功能概述: 1. **Servlet API**:这是...
10. **容器管理的安全性**:Java EE容器提供了安全性的管理机制,如角色基的访问控制(RBAC)、认证和授权。第五章可能会涵盖如何配置安全性,定义用户角色,以及保护应用程序的资源。 通过深入研究这些知识点,...
7. **JTA (Java Transaction API)**: 事务管理是Java EE应用中不可或缺的一部分。JTA用于管理分布式事务,确保数据的一致性和完整性。你需要知道ACID属性,并理解如何配置和使用JTA进行事务控制。 8. **JPA (Java ...
Java EE 7引入了WebSocket API,允许开发实时双向通信的应用,提供了一种高效且低延迟的方式进行客户端和服务器之间的数据交换,特别适用于游戏、聊天室等场景。 9. **JPA与Hibernate** Java Persistence API ...
Java EE教程通常会涵盖Servlet和JSP(JavaServer Pages)这两个核心Web组件。Servlet是服务器端的小程序,用于处理HTTP请求,而JSP则是一种动态网页技术,允许开发者将HTML与Java代码混合编写,提高了页面的动态性...
7. **Java Message Service (JMS)**:JMS是Java EE的一部分,用于异步通信和消息传递。它允许应用程序在不直接互相了解的情况下交换消息,增加了系统的灵活性和可扩展性。 8. **Transaction Management**:Java EE ...
11. **JSF(JavaServer Faces)**:Java EE的一种UI组件框架,提供声明式UI编程和事件处理机制。 12. **CDI(Contexts and Dependency Injection)**:Java EE中的依赖注入框架,用于管理对象的生命周期和依赖关系...
### Java EE 7:大局观 #### 关于Java EE 7 Java EE 7(Java Platform, Enterprise Edition 7)是Java企业级开发标准的一个重要版本,它在2013年发布。Java EE 7引入了许多新特性,旨在简化企业应用的开发、部署和...
7. **Web服务**:包括SOAP和RESTful两种风格,Java EE通过JAX-WS和JAX-RS提供支持。掌握如何创建和消费Web服务,理解WSDL和XML Schema是这一部分的重点。 8. **Java EE容器**:如Tomcat、Glassfish或WildFly等,...
7. **资源管理**:引入了JSR 299 Contexts and Dependency Injection for the Java EE平台,简化了组件之间的依赖管理和生命周期管理。 ### 许可与版权 《Java EE 6 教程》由Oracle及其附属公司版权所有,受知识...