Http Basic 认证
原创
©著作权归作者所有:来自51CTO博客作者緑水長流的原创作品,请联系作者获取转载授权,否则将追究法律责任
概述
当用户发送请求来到Http服务器进行Http Basic认证时,如果之前没有认证过,那么提示用户输入用户名和密码,如果正确,用户名和密码会经过base64编码后追加到请求头信息中再次请求服务器,服务器会根据请求头中携带的认证信息,来判断此次认证是否成功,此后,用户每次访问服务器的任何资源都会携带该请求头,不管资源是否受限
案例
下面我们通过代码来实现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
浏览器一直处于等待输入状态,点击取消后,响应状态如下:
在响应头中有一句我们刚刚设置的提示:
WWW-Authenticate: Basic realm="please accept Http Basic Authentication"
刷新页面,再次认证,输入在Tomcat中配置的正确的用户名和密码,认证成功
再次访问任意页面(无论是否受限页面),都会携带用户名和密码信息,信息如下:
该密文是 用户:密码的格式 经过base64编码后的结果
我的用户名密码编码后的是这个,大家也可以拿去解码一下:
解码如下:
当然也可以使用代码解码:
@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编码,这其实和明文差不多,适用于安全性要求不高的场景