zoukankan      html  css  js  c++  java
  • HTTP的几种认证方式之FormBase 认证(基于表单认证)

    HTTP/1.1 使用的认证方式有
      1)BASIC 认证(基本认证);
      2)DIGEST 认证(摘要认证);
      3)SSL 客户端认证;
      4)FormBase 认证(基于表单认证);

    本文目录

    1、基于表单认证
    2、基于表单认证一般会使用Cookie 来管理 Session(会话)
    3、Java + SpringBoot 简单演示表单登陆
    4、测试

    1、基于表单认证    <-- 返回目录

      基于表单的认证方法并不是 HTTP 协议中定义的 。客户端会向服务器上的 Web 应用程序发送登陆信息,按登陆信息的验证结果认证。根据 Web 应用程序的实际安装,提供的用户界面及认证方式也各不相同。多数情况下,输入用户名 ID 和密码等登陆信息后,发送给 Web 应用程序,基于认证结果来决定认证是否成功。

      由于使用上的便利性及安全性问题,HTTP 协议标准提供的 BASIC 认证和 DIGEST 认证几乎不怎么使用。另外,SSL 客户端认证虽然具有高度的安全等级,但因为导入及维持费用等问题,还尚未普及。

      不具备共同标准规范的表单认证,在每个 Web 网站上会有各自不同的实现方式。如果时全面考虑过安全性能而实现的表单认证,那么就能够具备高度的安全等级。

    2、基于表单认证一般会使用Cookie 来管理 Session(会话)    <-- 返回目录

      基于表单认证本身是通过服务器端的 Web 应用,将客户端发送过来的用户 ID 和密码进行校验。但鉴于 HTTP 是无状态协议,之前已认证成功的用户状态无法通过协议层面保存下来。即无法实现状态管理,因此即使当该用户下一次继续访问,也无法区分他与其他的用户。于是我们会使用 Cookie 来管理 Session,以弥补 HTTP 协议中不存在的状态管理功能。

       步骤1:客户端把用户 ID 和密码等登陆信息放到报文的实体部分,通常是以 POST 方法把请求发送给服务器。而这时,会使用 HTTPS 通信来进行 HTML 表单页面的显示和用户输入数据的传输。

      步骤2:服务器会发放用以标识用户的 Sesssion ID。通过验证从客户端发送过来的登陆信息进行身份认证,然后把用户的认证状态与 Session ID 绑定后记录在服务器端。

      向客户端返回响应时,会在首部字段 Set-Cookie 内写入 Session ID(如 PHPSESSID=028a8c...)。然而,如果 Session ID 被第三方盗走,对方就可以伪装成你的身份进行恶意操作了。因此必须防止 Session ID 被盗,或被猜出。为了做到这点,Session ID 应使用难以推测的字符串,且服务器端也需要进行有效期的管理,保证其安全性。另外,为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie 内加上 httponly 属性

    3、Java + SpringBoot 简单演示表单登陆    <-- 返回目录

       依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

      

      Controller

    package com.oy.controller;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class IndexController {
    
        /**
         * 访问登陆页面
         * @param req
         * @param res
         * @return
         */
        @RequestMapping(value = "/login", method = RequestMethod.GET)
        public String login(HttpServletRequest req, HttpServletResponse res) {
            return "login";
        }
    
        /**
         * 登陆
         * @param req
         * @param res
         * @return
         */
        @RequestMapping(value = "/login", method = RequestMethod.POST)
        @ResponseBody
        public String doLogin(HttpServletRequest req, HttpServletResponse res,
                @RequestParam(value = "username", required = true) String username,
                @RequestParam(value = "password", required = true) String password) {
    
            // 校验用户名和密码
            if (!"test".equals(username) || !"123456".equals(password)) {
                return "{code: 40502, msg: "用户名或密码错误"}";
            }
    
            HttpSession session = req.getSession();
            session.setAttribute("uid", 101);
            session.setAttribute("username", "test");
            session.setAttribute("status", 0);
            return "{code: 0, data: {uid:"101", username:"test"}}";
        }
    
        @RequestMapping("/userinfo")
        @ResponseBody
        public String getUserInfo(HttpServletRequest req, HttpServletResponse res) {
            Cookie[] cs = req.getCookies();
            if (cs != null && cs.length > 0) {
                for (Cookie c : cs) {
                    System.out.println(c.getName() + " = " + c.getValue());
                }
            }
    
            HttpSession session = req.getSession();
            Integer uid = (Integer) session.getAttribute("uid");
            if (uid == null) {
                res.setStatus(401);
                return "{code: 401, msg: "请登录"}";
            }
    
            return "{userinfo: {uid:"101", username:"test"}}";
        }
    
    }

    4、测试    <-- 返回目录

      1)首先访问 http://localhost:8089/BootDemo/userinfo,结果

      2)访问 http://localhost:8089/BootDemo/login, 弹出登陆页面

       3)登陆成功

       4)再次访问 http://localhost:8089/BootDemo/userinfo

      ---

  • 相关阅读:
    centos8 docker podman冲突问题技术就是要不断折腾 时刻踩坑
    systemd upstart sysvinit
    warden创建容器的过程
    Linux彩色输出
    cloudfoundry warden安装和配置
    The Architecture of Open Source Applications: Audacity
    The Architecture of Open Source Applications: Asterisk
    [转]查看dd的拷贝进度
    The Architecture of Open Source Applications Berkeley DB
    libcurl的段错误
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/12616404.html
Copyright © 2011-2022 走看看