概述

当用户发送请求来到Http服务器进行Http Basic认证时,如果之前没有认证过,那么提示用户输入用户名和密码,如果正确,用户名和密码会经过base64编码后追加到请求头信息中再次请求服务器,服务器会根据请求头中携带的认证信息,来判断此次认证是否成功,此后,用户每次访问服务器的任何资源都会携带该请求头,不管资源是否受限

案例

下面我们通过代码来实现Http Basic认证

项目结构

Http Basic 认证_Http Basic

配置web.xml

实例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<!-- Basic认证配置 -->
<security-constraint>
<!-- 配置受限资源 -->
<web-resource-collection>
<web-resource-name>Basic Auth Test</web-resource-name>
<url-pattern>/auth.html</url-pattern>
<url-pattern>/demo01</url-pattern>
</web-resource-collection>

<!-- 访问受限资源所要提供的权限 -->
<auth-constraint>
<role-name>emp</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<!-- 认证的方式 -->
<auth-method>BASIC</auth-method>
<realm-name>please accept Http Basic Authentication</realm-name>
</login-config>

</web-app>
  • web-resource-name:给认证取个名字
  • url-pattern:受限的资源(需要认证才可以访问的资源)
  • role-name:访问受限资源所需的权限
  • auth-method:认证的方式(这里使用的是Basic)
  • realm-name:认证时的提示语

修改Tomcat安装目录下的​​/conf/tomcat-users.xml​​配置文件,添加角色与用户

<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">

<!-- 创建一个权限 -->
<role rolename="emp"/>

<!-- 配置用户,给用户赋予emp权限 -->
<user username="wsir" password="admin" roles="emp"/>

</tomcat-users>

此时访问 demo01和auth.html都需要认证才可以访问

测试案例

访问请求:​​http://localhost:8080/auth.html​

Http Basic 认证_认证_02


浏览器一直处于等待输入状态,点击取消后,响应状态如下:

Http Basic 认证_Http Basic认证_03


在响应头中有一句我们刚刚设置的提示:

WWW-Authenticate: Basic realm="please accept Http Basic Authentication"

刷新页面,再次认证,输入在Tomcat中配置的正确的用户名和密码,认证成功

再次访问任意页面(无论是否受限页面),都会携带用户名和密码信息,信息如下:

Http Basic 认证_认证_04


该密文是 用户:密码的格式 经过base64编码后的结果

我的用户名密码编码后的是这个,大家也可以拿去解码一下:

d3NpcjphZG1pbg==

解码如下:

Http Basic 认证_Http Basic认证_05


当然也可以使用代码解码:

@Test
public void decode(){

String code="d3NpcjphZG1pbg==";
// 注意:Base64这个类是jdk1.8的!
byte[] decodeByte = Base64.getDecoder().decode(code);

System.out.println(new String(decodeByte));
}

总结

Http Basic认证方式操作方式简单,但是安全性不够高,当认证通过时,每次请求资源都会携带用户名和密码,而且用户名和密码仅是通过base64编码,这其实和明文差不多,适用于安全性要求不高的场景