spring-security认证登录探究1-默认登陆方式cookie+session

939 阅读2分钟

1、spring-security登录方案选择

根据官方文档(版本5.7.5,文档地址:docs.spring.io/spring-secu… ),spring-security支持的登录方案有如下图几种,

image.png

其中常用的是用户密码登录方案,在用户密码登录方案中有如下图3中,Form,Basic,Digest。

image.png

1.1、Basic,Digest

Basic,Digest是互联网标准(RFC)中定义的HTTP 身份验证方案(authentication schemes),Basic身份认证,是HTTP 1.0中引入的认证方案之一。所有的authentication schemes有: image.png

basic认证优点是实现简单,缺点是用户名密码base64编码传输 相当于明文传输,安全性低。例子:

GET /protected_docs HTTP/1.1 
Authorization: Basic Y2h5aW5ncDoxMjM0NTY=

Digest和Basic实现和优缺点类似,我们暂不研究。

1.2、Form

表单认证不在http身份验证规范中,实现方式多样化。表单认证一般都会配合cookie+sessiond的使用,现在绝大多数的Web站点都是使用此认证方式。用户在登录页中填写用户名和密码,服务端认证通过后会将sessionId返回给浏览器端,浏览器会保存sessionId到浏览器的Cookie中。因为Http是无状态的,所以浏览器使用Cookie来保存sessionId。下次客户端发送的请求中会包含sessionId值,服务端发现sessionId存在并认证过则会提供资源访问。

2、项目实战

2.1 创建一个springboot项目,版本2.6.10

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.10</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

引入spring-security依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

创建一个测试类TestController

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {


    @GetMapping("/test")
    @ResponseBody
    public String test() {
        return "success";
    }
}

浏览器访问 http://localhost:8080/test 跳转了默认的登录页面

image.png

用户名: user 密码(来自控制台打印): ac79af4a-790e-4038-b6d2-b6e9ec0c9eef 登录成功,页面显示success

image.png

2.2登录过程:

2.2.1 调用 /login 登录接口

请求:
Request URL: http://localhost:8080/login
Request Method:POST
Content-Type:application/x-www-form-urlencoded
FormData:username=user&password=ac79af4a-790e-4038-b6d2-b6e9ec0c9eef

响应:
Set-Cookie:JSESSIONID=796365617ADD716B2CEE18AD1F9023E5; Path=/; HttpOnly

2.2.2、调用 /test 接口

请求

Request URL:http://localhost:8080/test
Request Method:GET
Cookie:JSESSIONID=796365617ADD716B2CEE18AD1F9023E5

login请求会从InMemoryUserDetailsManager的HashMap:users中根据用户名user获取对应的用户

test接口请求中的cookie带了JSESSIONID,后台根据796365617ADD716B2CEE18AD1F9023E5找到 StandardManager类中的ConcurrentHashMap:sessions存放的session,表示验证通过,提供受保护的test接口资源。