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

  ---

原文地址:https://www.cnblogs.com/xy-ouyang/p/12616404.html