Tomcat 的 BASIC 基本验证是一种常见的验证方式,但这种验证的安全度不高,它的验证不同于表单类的验证,做法也很简单,主要用于 Web 方面的验证。
当将 Web 应用的 web.xml 文件中的 <auth-method> 元素设置为 BASIC 时,表明应用使用的是基本验证。
当每次浏览器请求受保护的 Web 应用资源时,Tomcat 都会使用 HTTP 基本验证向浏览器索取用户名和密码(浏览器以页面弹窗的方式提示用户输入用户名和密码)。
可以使用 IDEA、Eclipse 等工具创建一个 Web 项目(当然也可以手动创建),项目的的结构如下图:
其中,index.jsp 页面为 Web 应用的主页面,需要用户登录授权后才能访问。而 web.xml 是 Web 应用的配置文件。
index.jsp 页面内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>DEMO</title> </head> <body> <h1>BASIC 基本验证</h1> </body> </html>
web.xml 文件内容如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <security-constraint> <display-name>default</display-name> <!-- 需要限制访问的资源子集 --> <web-resource-collection> <web-resource-name>all files</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <!-- 指定可以访问该资源集合的用户角色,这里指定为 JAAS 中的角色 --> <auth-constraint> <role-name>manager-gui</role-name> </auth-constraint> <!-- 用来显示怎样保护在客户端和Web容器之间传递的数据 --> <!-- NONE 不需要传输保证 --> <!-- INTEGRAL 服务器和客户端之间的数据必须以某种方式发送,而且在传送中不能改变 --> <!-- CONFIDENTIAL 传输的数据必须是加密的数据 --> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <!-- 配置登录方式为 form 方式 --> <login-config> <!-- 指定验证方式 --> <auth-method>BASIC</auth-method> </login-config> </web-app>
注意,验证相关的配置见 <security-constraint> 和 <login-config> 元素的注释。其中,<role-name> 元素中设置的角色来源 Tomcat 领域配置的角色,如果配置使用 UserDatabase 领域,则来源 tomcat-users.xml 文件。如果配置使用 JAASRealm 领域,则来源我们注册的 Subject。
将该 Web 应用打包成 war 包的方式去部署运行 Web 应用,或者直接通过 IDEA 内置 Tomcat 功能运行该 Web 应用。
运行成功后,使用浏览器访问项目 index.jsp 页面。如下图:
由于我们访问了私有资源,浏览器弹出密码输入框,要求我们输入用户名和密码。如果用户名和密码正确,则验证成功,跳转到主页。
为了进一步了解 Basic 基础验证,我们可以打开浏览器开发工具(快捷键 F12),选择 “网络” 选项卡,重新进行登录。你会发现我们输入的登录信息是通过 HTTP 的 Authorization 请求头将用户名和密码传递给 Tomcat。如下图:
其中,“Authorization: Basic dG9tY2F0OmFhYWFhYQ==” 就是登录信息,使用 Base64 对 “dG9tY2F0OmFhYWFhYQ==” 进行解码,解码后为 “tomcat:aaaaaa”。如下图:
从上面可知,BASIC 基本验证几乎是通过明文形式传递用户名和密码,这是非常不安全的。
可能有的读者会问,你上面输入的用户名(tomcat)和密码(aaaaaa)是哪里来的?这些用户名和密码是配置在 tomcat-users.xml 文件中的。如下:
(1)在 server.xml 文件中配置 tomcat 使用 UserDatabase 领域
(2)在 tomcat-users.xml 文件中配置用户和角色,如下:
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <role rolename="admin-gui"/> <user username="tomcat" password="aaaaaa" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui"/> </tomcat-users>
上面配置中,tomcat 用户拥有 manager-gui、manager-script、manager-jmx、manager-status 和 admin-gui 角色。
如果我们在 web.xml 文件中 <role-name> 元素中设置的角色在领域中没有匹配的角色,会怎么样呢?直接报 “HTTP Status 403 - Access to the requested resource has been denied” 错误。如下图: