Basic认证

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

 

时间: 2024-12-03 14:30:14

Basic认证的相关文章

http auth basic认证保护后台admin

一个web站点,总会有一些资源需要保护,比如图片文件.某些页面等,使用basic认证简单方便,易于配置,且完全独立于开发.basic认证既可以在web容器上,也可以放到前端服务器上 .需要对后台地址admin进行保护,可以使用http auth basic,既方便又简单  resin配置  basic的resin配置需要在web项目的描述文件web.xml中,通过添加如下内容,可以对指定路径的资源进行保护,所有对指定资源的访问,都需要输入配置的用户名与密码,验证通过后才可以正常访问 Java代码

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

很多情况下目标Action方法都要求在一个安全上下文中被执行,这里所谓的安全上下文主要指的是当前请求者是一个经过授权的用户.授权的本质就是让用户在他许可的权限范围内做他能够做的事情,授权的前提是请求者是一个经过认证的用户.质询-应答(Chanllenge-Response)"是用户认证采用的一种常用的形式,认证方向被认证方发出质询以要求其提供用于实施认证的用户凭证,而被认证方提供相应的凭证以作为对质询的应答.旨在目标Action方法执行之前实施身分认证的AuthenticationFilter也

python访问需要basic认证的网站例子

以前一直不知道普通的路由器的弹出框是怎么搞的,最近才无意中知道是用basic认证的.正好可以使用下面的代码进行认证  代码如下 复制代码 import urllib2, base64 def listen_server(url,user,password):     request = urllib2.Request(url)     base64string = base64.encodestring('%s:%s' % (user,password))[:-1]     request.ad

浅谈HTTP使用BASIC认证的原理及实现方法_java

一.BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法.客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用

angularJs的http auth basic认证的例子

在jq里面,通过http auth basic认证的方法,可以直接在ajax参数里面放入username和password即可,如: $.ajax({  url: "/datacenter/identification/queryInfo",  contentType: 'application/json',  dataType: "json",  type: "POST",  data:JSON.stringify({'name':name,'

WebBrowser http basic 认证

问题描述 通过C#webbrowser访问一个网站,这个网站使用apache作为web服务器,使用httpbasic认证,实现自动登录,我写的代码如下stringurl="http://pbcdev.opple.com/Windchill/ptc1/zproject/create?wizardActionClass=cn.com.opple.budget.processor.CreateProjectBookFormProcessor&tableID=table__opple.proje

nginx添加http auth basic认证实现方法

需要对后台地址admin进行保护, http://www.abc/admin/admin.action之类的 可以使用http auth basic,既方便又简单, 1.首先要利用用apache 的 htpasswd 可以生成密码文件 只好先安装apache了 wget http://xxxx/tools/apache-2.0.63.tar.bz2 解压之后 ./configure --prefix=/home/app/httpd-2.0.63 make && make install 创

http basic authentication通过post方式访问api示例分享 basic认证示例_java

复制代码 代码如下: private static String url = PropertiesLoader.getProperty("ALLYES_SERVER", false);    private static String username = PropertiesLoader.getProperty("ALLYES_USERNAME", false);    private static String password = PropertiesLoad

Spring Security笔记:HTTP Basic 认证

在第一节 Spring Security笔记:Hello World 的基础上,只要把Spring-Security.xml里改一个位置 1 <http auto-config="true"> 2 <intercept-url pattern="/admin" access="ROLE_USER" /> 3 <http-basic /> 4 </http> 注意第三行,加上<http-basi