Basic 概述
HTTP 协议提供验证机制来保护资源。当一个请求要求取得受保护的资源时,网页服务器回应一个 401 Unauthorized error 错误码。这个回应包含一个指定了验证方法和领域(Realm)的 WWW-Authenticate 头信息。
Basic认证基本流程
1, 客户端向服务器请求数据,并且请求的数据是需要认证才能看的,并且客户端目前没有认证过。
2, 访问的页面需要认证,客户端弹出认证窗口。
认证窗口关闭之前,浏览器状态一直是:pending等待用户输入。
点击 x 或取消,将会出现401状态码,响应内容如下。
响应头中有一句话:
WWW-Authorization: Basic realm="Authentication required"
表示需要认证,默认提示信息为:Authentication required
WWW-Authorization提示内容可配置,如:
<login-config>
<!-- 认证方式,BASIC认证 -->
<auth-method>BASIC</auth-method>
<realm-name>not login yet</realm-name>
</login-config>
此时响应
3, 刷新页面,输入正确的用户名和密码,将会进入到我们的项目中。假如,我们的test.jsp页面内容:
<%@page import="org.apache.tomcat.util.codec.binary.Base64"%> <%@page language="java" import="java.util.*" %> <% Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = (String) headerNames.nextElement(); String headerValue = request.getHeader(headerName); out.println(headerName + ": " + headerValue + "<br/>"); } out.println("<hr/>"); String authHeader = request.getHeader("authorization"); String encodedValue = authHeader.split(" ")[1]; out.println(new String(Base64.decodeBase64(encodedValue))); %>
页面显示结果:
用户名、密码传输方式
用户名和密码用冒号“:”合并,将合并后的字符串使用BASE64编码,每次请求时,将编码后的字符串附于请求头中,服务器接收此字符串,进行解码,执行认证。
Basic认证的核心就是响应401状态码,告知浏览器需要用户输入用户名和密码,然后就是后台按照Base64解码认证。
启用Basic认证,web.xml配置
<!-- 下面是Basic认证配置 --> <security-constraint> <display-name>Security Constraint</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <!-- 哪些地址需要认证,/*表示此项目的任意地址都需要认证 --> <url-pattern>/*</url-pattern> <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> </web-resource-collection> <auth-constraint> <role-name>tomcat</role-name> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <!-- 认证方式,BASIC认证 --> <auth-method>BASIC</auth-method> <realm-name>not login yet</realm-name> </login-config> <!-- Basic认证配置结束 -->
配置说明
<security-constraint>:这个元素限制对一个或者多个资源的访问,可以在配置信息中出现多次,
<security-constraint> 包含了下列元素:
<web-resource-collection>:这个元素用于标识你想限制访问的资源。
你可以定义 URL 模式 和 HTTP 方 法 (用 <http-method> 元素定义 HTTP 方法)。
如果没有定义 HTTP 方法,那么限制将应用于所有方法。
<auth-constraint>:这个元素可以访问上面定义的受限资源的用户角色
<login-config>:这个元素用于指定验证方法。它包含下列元素:
<auth-method>:指定验证方法。它的值可能是下列值集中的一个:BASIC (基本验证)、DIGEST (摘要验证)、FORM (基于表单的验证) 或者 CLIENT-CERT (客户证书验证)。
<realm-name>:如果选用 BASIC 方法进行验证的时候,WWW-Authenticate 头信息中的一个描述。
通用web服务器都对Basic认证提供了支持,Tomcat启用Basic认证,需要修改 tomcat-users.xml
<tomcat-users version="1.0" xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"> <role rolename="tomcat"/> <role rolename="manager"/> <user username="tomcat" password="123456" roles="tomcat"/> <user username="both" password="123456" roles="tomcat,manager"/> <user username="manager" password="123456" roles="manager"/> </tomcat-users>
Basic认证缺点
HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎都采取了这种方式。其缺点是没有灵活可靠的认证策略,另外,BASE64的加密强度非常低,直接能在请求头中看到,几乎相当于明文了。