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();
response.setHeader("WWW-Authenticate", "Basic realm=\"input username and password\"");
out.print("401 认证失败");
return;
}
String userAndPass = new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[]));
if (userAndPass.split(":").length < ) {
response.setStatus();
response.setHeader("WWW-Authenticate", "Basic realm=\"input username and password\"");
out.print("401 认证失败");
return;
}
user = userAndPass.split(":")[];
pass = userAndPass.split(":")[];
if (user.equals("") && pass.equals("")) {
session.setAttribute("user", user);
// 跳转合适的地方
} else {
response.setStatus();
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的加密强度非常低,直接能在请求头中看到,几乎相当于明文了。

HTTP Basic auth认证的更多相关文章

  1. java 发送带Basic Auth认证的http post请求

    构造http header private static final String URL = "url"; private static final String APP_KEY ...

  2. iOS AFNetWorking下得Basic Auth认证请求方式

    我新入职了一家公司,做了一个项目,服务器的大哥说他采用的是Basic Auth认证请求方式,一般我们用的都是OAuth的认证方式,下面我们就对比一下这两种认证方式 百度百科得到如下 Basic Aut ...

  3. Http basic Auth 认证方式帮助类

    BasicAuthenticationUtil import java.io.IOException; import java.security.MessageDigest; import javax ...

  4. java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY ...

  5. ios开发使用Basic Auth 认证方式

    http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth ...

  6. 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证

    本文是精讲RestTemplate第9篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  7. Etcd安全配置之Basic Auth认证

    <中小团队落地配置中心详解>文章中我们介绍了如何基于Etcd+Confd构建配置中心,最后提到Etcd的安全问题时说了可以使用账号密码认证以达到安全访问的目的,究竟该如何开启认证以及怎么设 ...

  8. httpclient进行basic auth认证

    private HttpClientContext context = HttpClientContext.create(); public void addUserOAuth(String user ...

  9. (74)zabbix第三方认证之http(nginx basic auth)

    HTTP Basic Auth认证方式,我们将在实例中使用nginx来演示,Apache也类似. zabbix认证配置 Administration>> Authentication,将h ...

随机推荐

  1. Atlassian发布JIRA项目组合管理解决方案

    在其年度用户峰会上,开发和协作软件供应商Atlassian发布了JIRA Portfolio,JIRA Portfolio是JIRA的一个附加组件"可以提供简单准确的视图用于计划和管理跨团队 ...

  2. Oracle 11gR2 RAC连接时ORA-12545错误

    刚装成的Oracle 11gR2的RAC集群 三个节点 创建好数据库,一切都在正常的进行中 然后去安装了一个oracle client,进行链接时出现了ORA-12545 然后简单的baidu了一下, ...

  3. 使用神经网络识别手写数字Using neural nets to recognize handwritten digits

    The human visual system is one of the wonders of the world. Consider the following sequence of handw ...

  4. Selenium IDE 基础使用教程

    Selenium IDE 基础使用教程 简介及安装 Selenium IDE 是一个易于使用的Firefox插件.它提供了一个图形用户界面,可进行脚本录制及导出.其记录的脚本可以被转换成多种编程语言( ...

  5. 十二.spring-boot使用spring-boot-freemarker

    ①.在springMVC中:它代表着view层组件 ②.为什么使用freemarker:简单容易学.逻辑分明 ③.freemarker优点:它不依赖servlet.网络或者web环境 一.创建一个ma ...

  6. asp.net Mvc Area 找到多个与名为相同的控制器匹配的类型 请通过调用含有“namespaces”参数

    MVC中的Area的区域的时候,在一个Area中定义了一个Home控制器,在启动的时候, 找到多个与名为"Home"的控制器匹配的类型.如果为此请求("{controll ...

  7. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

    1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...

  8. 一步一步学RenderMonkey(4)--点光源光照模型 【转】

    转载请注明出处:http://blog.csdn.net/tianhai110 点光源光照模型: 公式: I = Icolor*attenuation;                        ...

  9. scrapy-splash抓取动态数据例子六

    一.介绍 本例子用scrapy-splash抓取中广互联网站给定关键字抓取咨询信息. 给定关键字:打通:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信 ...

  10. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...