专栏首页程序生涯HTTP使用BASIC认证的原理及实现方法

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

一. BASIC认证概述

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

二. BASIC认证的过程

1. 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:

Get /index.html HTTP/1.0

Host:www.google.com

2. 服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:

HTTP/1.0 401 Unauthorised

Server: SokEvo/1.0

WWW-Authenticate: Basic realm="google.com"

Content-Type: text/html

Content-Length: xxx

3. 当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

4. 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:

Get /index.html HTTP/1.0

Host:www.google.com

Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

注:xxxx....表示加密后的用户名及密码。

5. 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:三. BASIC认证的缺点

HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎 都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域(domain或realm)认证功能,另外,BASE64的加密强度非常低,可以说仅 能防止sohu的搜索把它搜到了。当然,HTTP基本认证系统也可以与SSL或者Kerberos结合,实现安全性能较高(相对)的认证系统

三.BASIC认证的JAVA实现代码

HttpSession session = request.getSession();
String user = (String)session.getAttribute("user");
String pass;

if(user == null){
    try{
        response.setCharacterEncoding("GBK");
    PrintWriter ut = response.getWriter();
    String authorization = request.getHeader("authorization");
     if(authorization == null||authorization.equals("")){
        response.setStatus(401);
      response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
      out.print("对不起你没有权限!!");
      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=\"请输入管理员密码\"");
      out.print("对不起你没有权限!!");
      return;
    }
    user = userAndPass.split(":")[0];
    pass = userAndPass.split(":")[1];
    if(user.equals("111")&&pass.equals("111")){
        session.setAttribute("user",user);
      RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
      dispatcher.forward(request,response);
    }else{
        response.setStatus(401);
         response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
        out.print("对不起你没有权限!!");
      return;
    }
  }catch(Exception ex){
      ex.printStackTrace();
    }
}else{
    RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
  dispatcher.forward(request,response);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 禁止网页右键、复制、另存为、查看源文件等功能

    用户7657330
  • Git在公司内部的使用规范

    fix:修复 xxx Bug feat:新增 xxx 功能 test:调试 xxx 功能 style:变更 xxx 代码格式或注释 docs:变更 xx...

    用户7657330
  • RESTful API 设计最佳实践

    Web API 近几年变得越来越火,而简洁的 API 设计在多后端系统交互应用中也变得尤为重要。通常,会使用 RESTful API 来作为我们的 Web AP...

    用户7657330
  • selenium_基本使用

    版权声明:Copyright © ...

    zhengzongwei
  • 为什么Java中类的成员变量不能被重写?成员变量在Java中能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

    这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏)

    desperate633
  • selenium-webdriver|4 常用API介绍

    <option value="自动化测试">自动化测试</option>

    测试邦
  • Powershell快速入门(二) Shell编程

    这一部分着重于介绍Powershell的程序知识,让我们能够编写功能强大的Powershell脚本,执行比较复杂的任务。 变量 变量使用$变量名创建和引用。举个...

    乐百川
  • Godot3游戏引擎入门之十一:Godot中的粒子系统与射击游戏(上)

    2018-12-23 by Liuqingwen | Tags: Godot | Hits

    IT自学不成才
  • python-selenum3 第三天基

    py3study
  • java SWT:MouseEvent,KeyEvent中stateMask字段的用法

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648

扫码关注云+社区

领取腾讯云代金券