Basic 概述

Basic 认证是HTTP 中非常简单的认证方式,因为简单,所以不是很安全,不过仍然非常常用。

当一个客户端向一个需要认证的HTTP服务器进行数据请求时,如果之前没有认证过,HTTP服务器会返回401状态码,要求客户端输入用户名和密码。用户输入用户名和密码后,用户名和密码会经过BASE64加密附加到请求信息中再次请求HTTP服务器,HTTP服务器会根据请求头携带的认证信息,决定是否认证成功及做出相应的响应。

使用Tomcat进行Basic认证

如果熟悉Tomcat的朋友,肯定知道Tomcat自带的有个manager项目,访问这个项目需要Basic认证。

下面我们来给我们自己的项目加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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>lvyou</display-name>
<servlet>
<servlet-name>home</servlet-name>
<servlet-class>com.coder4j.web.servlet.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>home</servlet-name>
<url-pattern>/home.do</url-pattern>
</servlet-mapping> <!-- 下面是Basic认证配置 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>GuiLin</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection> <auth-constraint>
<role-name>lvyou</role-name>
</auth-constraint>
</security-constraint> <login-config>
<auth-method>BASIC</auth-method>
<realm-name>guilin photos</realm-name>
</login-config>
<!-- Basic认证配置结束 --> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

对上面加注释的部分进行简单的解释:

  • web-resource-name : 给这个认证起个名字

  • url-pattern : 哪些地址需要认证,/*表示此项目的任意地址都需要认证,/lvyou/*表示/lvyou下的任意地址都需要认证。

  • role-name : 哪些角色的用户认证后可以访问此资源(光认证还不够哟,必须得是许可的角色哟),我这里规定必须是lvyou这个角色的用户才能看我的照片。

  • auth-method : 认证方式为BASIC认证。

  • realm-name : 给出的认证提示

修改 tomcat-users.xml

tomcat 提供了用户配置文件,我们直接使用就行了。

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="lvyou"/>
<user username="tom" password="tomcat" roles="lvyou"/>
</tomcat-users>

至此,两步就完成了Basic 认证,如果想访问我的照片,就需要输入tom 和 tomcat才行哟。

当然配置方式不止这一种,网上一搜很多的,有机会再整理一部分,这里仅仅想介绍Basic认证。

Basic 认证的过程

由上面的实战可以得知,Basic认证的流程很简单,现概述如下:

1, 客户端向服务器请求数据,并且请求的数据是需要认证才能看的,并且客户端目前没有认证过。

2, 访问的页面需要认证,客户端弹出认证窗口。

认证窗口关闭之前,浏览器状态一直是:pending等待用户输入。

点击 x 或取消,将会出现401状态码,响应内容如下:

响应头中有一句话:


WWW-Authorization: Basic realm="guilin photos"

表示需要认证,提示信息为:guilin photos

3, 刷新页面,输入正确的用户名和密码,将会进入到我们的项目中

输入用户名和密码的请求信息头如下:

这是我们的认证信息。加密策略如下:

用户名和密码用:合并,将合并后的字符串使用BASE64加密为密文,每次请求时,将密文附于请求头中,服务器接收此密文,进行解析,判断是否认证

Java 实现

我们知道了流程,当然可以用代码来实现。

核心代码:

HttpSession session = request.getSession();
String user = (String) session.getAttribute("user");
String pass;
if (user == null) {
try {
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String authorization = request.getHeader("Authorization");
if (authorization == null || authorization.equals("")) {
response.setStatus(401);
response.setHeader("WWW-Authenticate", "Basic realm=\"input username and password\"");
out.print("401 认证失败");
return;
}
String userAndPass = new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));
if (userAndPass.split(":").length < 2) {
response.setStatus(401);
response.setHeader("WWW-Authenticate", "Basic realm=\"input username and password\"");
out.print("401 认证失败");
return;
}
user = userAndPass.split(":")[0];
pass = userAndPass.split(":")[1];
if (user.equals("111") && pass.equals("111")) {
session.setAttribute("user", user);
// 跳转合适的地方
} else {
response.setStatus(401);
response.setHeader("WWW-Authenticate", "Basic realm=\"input username and password\"");
out.print("401 认证失败");
return;
}
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
// 跳转合适的地方
}

Basic认证的核心就是响应401状态码,告知浏览器需要用户输入用户名和密码,然后就是后台按照Basic加密的方式进行解密验证即可。

缺点

HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,
如大家所用路由器的配置页面的认证,几乎都采取了这种方式。
其缺点是没有灵活可靠的认证策略,另外,BASE64的加密强度非常低,直接能在请求头中看到,几乎相当于明文了。

https://segmentfault.com/a/1190000004406025

Basic认证的更多相关文章

  1. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户.授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者 ...

  2. iOS进行Basic认证与NTLM认证

    一.iOS进行Basic认证 只需要在NSMutableURLRequest的Header中添加认证所需的Username和password. NSMutableURLRequest *webReq ...

  3. Nginx 配置 Basic 认证

    /* * 环境:LNMP(CentOS 6.6 + Nginx 1.8.0) */ 在 Nginx 下配置 Basic 认证需要依靠 Nginx 的 http_auth_basic_module 模块 ...

  4. Apache 配置 Basic 认证

    /* * 环境:WAMP( Windows7 + WampServer2.2(Apache 2.2.21)) */ 配置过程: ① 生成用户文件,文件路径可以使用绝对路径,也可以使用相对路径 进入 a ...

  5. Http Basic认证

    Http Basic认证就是访问的时候把用户名和密码用base64加密放在request的header的authorization中 服务端直接获取authorization,解析,跟用户名匹配即可. ...

  6. Burpsuite之Http Basic认证爆破

    有的时候经常遇到401.今天正好朋友问怎么爆破,也顺便记录一下 怕忘记了 referer:http://www.2cto.com/Article/201303/194449.html 看到Burpsu ...

  7. HTTP使用BASIC认证的原理及实现方法

    一.   BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户 ...

  8. HTTP使用BASIC认证的原理及实现方法(还有NTLM方法,比较复杂)

    一.   BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客 ...

  9. HTTP使用BASIC认证的原理及实现方法 (转载)

    转自:http://blog.itpub.net/23071790/viewspace-709367 一.   BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许 ...

随机推荐

  1. flowvisor test(1)

    参考: Flowvisor 入门 杨帅老师:mininet+FlowVisor+ODL环境搭建及实验1 安装: 参考: 1.Flowvisor安装 2.Mininet安装 3.官网,Floodligh ...

  2. Sphinx+MySQL5.1x+SphinxSE+mmseg

    一.不停止mysql的情况下安装SphinxSE 1.确定mysql版本,下载对应源码包 此处下载5.1.69的mysql源码包 #wget ftp://ftp.ntu.edu.tw/pub/MySQ ...

  3. Scrapy安装介绍

    一. Scrapy简介 Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl we ...

  4. LAMP环境搭建教程(原创)

    学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...

  5. ②springMVC入门

    1 1.1      需求 以案例作为驱动. springmvc和mybaits使用一个案例(商品订单管理). 功能需求:商品列表查询 1.2      环境准备 数据库环境:mysql5.1

  6. 费用性支出预分摊form方式和web方式区别

    预分摊 1 form方式 费用性支出先通过生产资产行请求 生成一个资产行,如果该资产行分摊到两个资产上则分割成两个资产行,既所谓的针对资产行进行分摊. 2 web方式 费用性支出直接分摊到资产上形成资 ...

  7. 从cookie的setDomain方法可以得知localhost不是域名

    http://www.baidu.com 其中baidu.com是一个域名.那么http://localhost 中的localhost是不是域名呢?我百度过,发现有人说这是域名.于是我在自己的web ...

  8. python之列表切片(slice)

    使用索引获取列表的元素(随机读取) 列表元素支持用索引访问,正向索引从0开始 colors=["red","blue","green"] c ...

  9. 【Android测试】【第九节】MonkeyRunner—— 初识

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4836815.html 不得不说两句,过了这么久才再次更新博 ...

  10. job_chain

    JOB链:JOB之间的相互触发操作. 实验意图:有些JOB具有先后调用次序,比如先做一件事情,这件事情做完才能继续下一件事情,而第一个JOB如果自己挂掉的话,第二个JOB需要正常运行(默认是终止),这 ...