HTTP Basic auth认证
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认证的更多相关文章
- java 发送带Basic Auth认证的http post请求
构造http header private static final String URL = "url"; private static final String APP_KEY ...
- iOS AFNetWorking下得Basic Auth认证请求方式
我新入职了一家公司,做了一个项目,服务器的大哥说他采用的是Basic Auth认证请求方式,一般我们用的都是OAuth的认证方式,下面我们就对比一下这两种认证方式 百度百科得到如下 Basic Aut ...
- Http basic Auth 认证方式帮助类
BasicAuthenticationUtil import java.io.IOException; import java.security.MessageDigest; import javax ...
- java 发送带Basic Auth认证的http post请求实例代码
构造http header private static final String URL = "url"; private static final String APP_KEY ...
- ios开发使用Basic Auth 认证方式
http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式 一种是Basic Auth,一种是OAuth ...
- 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
本文是精讲RestTemplate第9篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- Etcd安全配置之Basic Auth认证
<中小团队落地配置中心详解>文章中我们介绍了如何基于Etcd+Confd构建配置中心,最后提到Etcd的安全问题时说了可以使用账号密码认证以达到安全访问的目的,究竟该如何开启认证以及怎么设 ...
- httpclient进行basic auth认证
private HttpClientContext context = HttpClientContext.create(); public void addUserOAuth(String user ...
- (74)zabbix第三方认证之http(nginx basic auth)
HTTP Basic Auth认证方式,我们将在实例中使用nginx来演示,Apache也类似. zabbix认证配置 Administration>> Authentication,将h ...
随机推荐
- andriod inputbox
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- fmri 分析数据 fsl & spm 两大平台比对
基于下面这份ppt:Comparing SPM and FSL, by lChris Rorden fsl & spm都是免费的,都很受欢迎.spm更受欢迎. 两者的区别在于何时利用norma ...
- mysql 碎片清理
在MySQL中,我们经常会使用VARCHAR.TEXT.BLOB等可变长度的文本数据类型.不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理. 那么,为什么在使 ...
- [转]双TOP二分法生成分页SQL类(支持MSSQL、ACCESS)
本文转自:http://www.cnblogs.com/jitian/archive/2011/03/22/1991961.html 博客开张,先发以前的几个老物件儿,以前写下来的,现在发上来权当记录 ...
- WINXP上安装及使用SqlMap之方法
1.首先下载SqlMap 点击下载.2.其次下载用于Windows系统的Python ……点击这里…… 3.然后安装Python:Python默认安装的路径是“C:\Python”(你也可以修改安装路 ...
- c++ opencv3.4 保存和读取PCA模型
cv::PCA pca(samples, cv::Mat(), cv::PCA::DATA_AS_ROW,); FileStorage fs("pca.xml",FileStora ...
- scrapy-splash抓取动态数据例子八
一.介绍 本例子用scrapy-splash抓取界面网站给定关键字抓取咨询信息. 给定关键字:个性化:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信息 ...
- 用java源代码学数据结构<七>: BST
/* * 以int类为例 * 其它的类必须能够比较 * */ //二叉搜索树的节点点 class BSTNode{ int item; BSTNode lc; BSTNode rc; BSTNode ...
- HDU 4372 - Count the Buildings(组合计数)
首先想过n^3的组合方法,即f(i,j,k)=f(i-1,j,k)*(i-2)+f(i-1,j-1,k)+f(i-1,j,k-1),肯定搞不定 然后想了好久没有效果,就去逛大神博客了,结果发现需要用到 ...
- linux 设置 亮度
调整系统运行的配置文件位于 /sys/class/ 文件夹下. 调整亮度在 /sys/class/backlight/XXXX/brightness XXXX 是因为使用的驱动不一样,名称就会不一样, ...