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

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

本节书摘来异步社区《Java EE 7精粹》一书中的第2章,第2.7节,作者:【美】Arun Gupta,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.7 安全

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

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

29f56e5cbce8b026cbca56478b40f3171c6d28ed

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

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

e5340c835b9387f110d2b944c80ca705c39fe21e

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

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

172843512cbb133af01f3aa908e3b3eadb3390cd

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

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

1dd6f0bbccdae41f9c78187b38a1496f650aea2c

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

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

2667ffbbfab02e5d22ff0ca86516f37c56346b9f

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

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

8449efa81c5d2092cf17ed2972ba321a01858c5b

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

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

929d191836093b28b1879fcf6364466321db7d27

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

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

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

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

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

b8697c816fc59ddf7cb51989dbe45f18aeea6f7a

这段代码显示了如何实现基于表单的身份验证。登录表单必须包含输入用户名和密码字段,字段必须分别命名为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配置的容器登录机制来验证当前请求的用户。

相关文章
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
497 1
|
6月前
|
设计模式 算法 Java
Java SE 与 Java EE 组件封装使用方法及实践指南
本指南详细介绍了Java SE与Java EE的核心技术使用方法及组件封装策略。涵盖集合框架、文件操作、Servlet、JPA、EJB和RESTful API的使用示例,提供通用工具类与基础组件封装建议,如集合工具类、文件工具类、基础Servlet、实体基类和服务基类等。同时,通过分层架构集成示例展示Servlet、EJB和JPA的协同工作,并总结组件封装的最佳实践,包括单一职责原则、接口抽象、依赖注入、事务管理和异常处理等。适合希望提升代码可维护性和扩展性的开发者参考。
218 0
|
10月前
|
人工智能 监控 安全
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
293 5
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
288 2
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
813 1
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
193 4
|
存储 缓存 前端开发
JavaEE初阶——初识EE(Java诞生背景,CPU详解)
带你从零入门JAVAEE初阶,Java的发展历程认识什么是cpu,cpu的工作原理,cpu是如何进行计算的,cpu的架构,指令集,cpu的核心,如何提升cpu的算力,cpu的指令,,cup的缓存,cpu的流水线
|
安全 Java API
java安全特性
java安全特性
100 9
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
272 1
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
262 0