HTTP Basic 认证

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的加密强度非常低,直接能在请求头中看到,几乎相当于明文了。

猜你喜欢

转载自huangqiqing123.iteye.com/blog/2410417