Java Web 实现 HTTP Basic

Wesley13
• 阅读 841

Basic 认证是一种较为简单的 HTTP 认证方式,客户端通过明文(Base64 编码格式)传输用户名和密码到服务端进行认证,通常需要配合 HTTPS 来保证信息传输的安全。界面如下。

Java Web 实现 HTTP Basic

下面基于 Servlet 标准 Filter 实现一个 HTTP Basic 登录机制,可以用作测试时的临时发布用。部分函数利用了 AJAXJS 库。

package com.ajaxjs.web;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ajaxjs.util.Encode;
import com.ajaxjs.util.CommonUtil;
import com.ajaxjs.util.logger.LogHelper;

/**
 * 简单的 HTTP Basic 登录
 * 
 * @author sp42 frank@ajaxjs.com
 */
public class HttpBasicAuthFilter implements Filter {
    private static final LogHelper LOGGER = LogHelper.getLog(HttpBasicAuthFilter.class);

    /**
     * 登录名,写死只有一个用户 admin
     */
    private static final String userid = "admin";

    /**
     * 登录密码
     */
    private static String pwd = "123123";
    
    /**
     * 报告是否启动的状态,让外界知晓
     */
    public static boolean isEnadble = false;

    @Override
    public void init(FilterConfig config) throws ServletException {
        LOGGER.info("启动 HTTP BasicAuth 后台管理");

        if (config.getInitParameter("adminPassword") != null)
            pwd = config.getInitParameter("adminPassword");// 读取 web.xml 配置里的密码
        
        isEnadble = true;
    }

    @Override
    @SuppressWarnings("deprecation")
    public void doFilter(ServletRequest _request, ServletResponse _response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) _request;
        HttpServletResponse response = (HttpServletResponse) _response;

        if (!checkAuth(request)) {
            String msg = "\"Please input your account\""; // 如果认证失败,则要求认证 ,不能输入中文

            response.setCharacterEncoding("utf-8");
            response.setStatus(401, "Authentication Required");// 发送状态码 401, 不能使用 sendError,坑
            response.setHeader("WWW-Authenticate", "Basic realm=" + msg);// 发送要求输入认证信息,则浏览器会弹出输入框
            response.setCharacterEncoding("utf-8");
            response.getWriter().append("<meta charset=\"utf-8\" />Please login! 请登录系统!");

            LOGGER.info("HTTP BasicAuth 登录失败!");
        } else {
            // request.setAttribute("userName", userid);
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

    /**
     * 检查是否合法登录
     * 
     * @param request 请求对象
     * @return 是否合法登录
     */
    private static boolean checkAuth(HttpServletRequest request) {
        return checkAuth(request.getHeader("Authorization"), userid, pwd);
    }

    /**
     * 是否不合法的数组
     * 
     * @param arr
     * @return 是否不合法的数组
     */
    private static boolean isBadArray(String[] arr) {
        return arr == null || arr.length != 2;
    }

    /**
     * 检查是否合法登录
     * 
     * @param authorization 认证后每次HTTP请求都会附带上 Authorization 头信息
     * @param username 用户名
     * @param password 密码
     * @return true = 认证成功/ false = 需要认证
     */
    private static boolean checkAuth(String authorization, String username, String password) {
        if (CommonUtil.isEmptyString(authorization))
            return false;

        String[] basicArray = authorization.split("\\s+");
        if (isBadArray(basicArray))
            return false;

        String idpass = Encode.base64Decode(basicArray[1]);
        if (CommonUtil.isEmptyString(idpass))
            return false;

        String[] idpassArray = idpass.split(":");
        if (isBadArray(idpassArray))
            return false;

        return username.equalsIgnoreCase(idpassArray[0]) && password.equalsIgnoreCase(idpassArray[1]);
    }
}

HTTP Basic 安全性还是太弱,所以可以考虑加强版: 摘要认证——HTTP Digest。

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
莎利亚 莎利亚
3年前
JWT 认证方案学习
定义JWT(JSONWEBTOKEN)是一种安全通讯标准,它定义了一种紧凑自包含的方式,用于在各方之间安全的传输JSON对象。常见应用场景是API之间的认证通讯。一般的用户认证流程1、请求方发送账户密码到服务器,验证账户可用性。2、验证成功,生成session,保存在服务端。3、服务端返回一个s
kenx kenx
3年前
Java MD5和SHA256等常用加密算法
前言我们在做java项目开发的时候,在前后端接口分离模式下,接口信息需要加密处理,做签名认证,还有在用户登录信息密码等也都需要数据加密。信息加密是现在几乎所有项目都需要用到的技术,身份认证、单点登陆、信息通讯、支付交易等场景中经常会需要用到加密算法,所谓加密算法,就是将原本的明文通过一系列算法操作变成密文。1.BASE严格地说,属于编码格式,而非加密算法
Stella981 Stella981
3年前
Electron应用使用自签名证书进行HTTPS链接
为什么要使用https通俗点讲https就是加密的http,http的链接是明文传输,被黑客截获后可以查看你传输的所有内容,包括用户名、密码等,从而盗取你的帐户信息。使用https,虽然黑客仍能获取你传输的所有数据,但只能看到一堆密文,保证了数据安全。安装OpenSSL非windows用户可
Stella981 Stella981
3年前
Shiro要点概览与SpringBoot整合实例
1\.简介概念说明Subject主体,简化点说就是用户实体PrincipalSubject的唯一标识,如id、用户名、手机号、邮箱等Credential凭证信息,主体证明自己的东西,如密码、证书等Authenticator认证器,对Subject身份进行认证,例如验证用户的用户名和密码是否匹配Aut
Wesley13 Wesley13
3年前
HTTPS的工作原理
目的http就是我们平时浏览网页时候使用的一种协议(网站是以http://开头)。http协议传输的数据都是未加密的(明文),一次http协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,出现了https,下面讨论一下https的工作原理:概述HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一
Stella981 Stella981
3年前
OAuth(开放授权)
HTTPBasicAuthHTTPBasicAuth简单点说明就是每次请求API时都提供用户的username和password,简言之,BasicAuth是配合RESTfulAPI使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此
Wesley13 Wesley13
3年前
JavaWeb编程基础
JavaWeb是用Java技术来解决相关web互联网领域的技术总和。Java提供了技术方案可以解决客户端和服务器端的实现,特别是服务器的应用,比如Servlet,JSP和第三方框架等等。1\.http协议超文本传输协议,是一种应用层的网络传输协议http协议的特点:1.简单,快速:支持多种不同的的数据提交方式,如g
Stella981 Stella981
3年前
App开放接口api安全性的设计与实现
前言在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目中,大多数采用保存的session中,然后在存一份到cookie中,来保持
Easter79 Easter79
3年前
Tomcat容器管理安全的几种验证方式
当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是:BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令DIGEST(摘要验证):通过HTTP验证,需要提供摘要编码字符串的用户口令FORM(表单验证):在