1、Basic协议认证概述
在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后:会提示用户输入用户名及蜜码.然后将用户名及密码以BASE64加密;
加蜜后的密文将附加于请求信息史:如当用户名为admin,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。
2、post模拟请求
3、拦截器判断
package com.shucha.deveiface.web.interceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class OpenApiInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String authorization = request.getHeader("Authorization");
// 1、通过用户名和密码编码比对
String userName = "admin";
String passWord = "123456";
//编码
String message = userName + ":" + passWord;
String encode = Base64.getEncoder().encodeToString(message.getBytes(StandardCharsets.UTF_8)); // 方式一
if(authorization.equals(encode)) {
return true;
}
// 2、通过解码获取的authorization
//数据解密
String oldMsg = new String(Base64.getDecoder().decode(authorization));
if(oldMsg != null && oldMsg != "") {
oldMsg = oldMsg.replace("Basic ","");
String userName1 = oldMsg.split(":")[0];
String passWord1 = oldMsg.split(":")[1];
}
// 第三种方法是通过 解码Authorization 获得的用户名和密码去数据库查询是存在
Boolean b = true;
String authorization = request.getHeader("Authorization");
log.info("获取的接口校验Basic值:{}", authorization);
if(StringUtil.isNotBlank(authorization)) {
String basicData = new
String(Base64.getDecoder().decode(authorization.replace("Basic ","")));
if(StringUtil.isNotBlank(basicData)) {
// 用户名
String userName = basicData.split(":")[0];
// 密码
String passWord = basicData.split(":")[1];
// 根据用户名和密码查询basic协议用户
Integer total = getBasicByUserName(userName, passWord);
if(total == 0) {
b = false;
}
} else {
b = false;
}
} else {
b = false;
}
}
4、Base64Data 编码解码
package com.shucha.deveiface.biz.test;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* @author tqf
* @Description Basic协议 加密获得Authorization
* @Version 1.0
* @since 2022-08-15 16:09
*/
public class Base64Data {
public static void main(String[] args) {
base64Data();
}
public static void base64Data() {
String userName = "admin";
String passWord = "123456";
//数据编码
String message = userName + ":" + passWord;
String encode = Base64.getEncoder().encodeToString(message.getBytes(StandardCharsets.UTF_8)); // 方式一
String encode2 = new String(Base64.getEncoder().encode(message.getBytes()), StandardCharsets.UTF_8); // 方式二
System.out.println(encode);
System.out.println(encode2);
//数据解码
String oldMsg = new String(Base64.getDecoder().decode(encode));
System.out.println(oldMsg);
}
}