Basic协议认证原理和实现

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);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码奴生来只知道前进~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值