spring security

Spring Security

1、配置 Spring Security

WebSecurityConfigurerAdapter 中的 configure(HttpSecurity)

1
2
3
4
5
6
7
http
.authorizeRequests()
.anyRequest().anthenticated() // 任何请求都会进行认证
.and()
.formLogin() // 启用内建的登录界面
.and()
.httpBasic(); // 使用 HTTP Basic Auth 认证

2、CSRF 攻击

前提条件:用户已经登录正常站点

csrf 攻击对无状态的无效

防止收到 CSRF 攻击的方式

  1. CSRF Token
  2. 在响应中设置 Cookie 的 SameSite 属性

3、Remember-me 功能

为解决 session 过期后用户的直接访问问题

Spring Security 提供开箱即用的配置 rememberMe

原理:使用 Cookie 存储用户名,过期时间,以及一个 Hash

Hash:md5(用户名+过期时间+密码+key)

4、密码

4.1、密码简史

4.2、Spring Security 对密码哈希的算法支持

4.3、密码的验证规则

  1. 密码的验证比较复杂,使用 Passay 框架进行验证
  2. 封装验证逻辑在注解中,有效的剥离验证逻辑和业务逻辑
  3. 对于两个以上属性的复合验证,可以写一个应用于类的注解

5、Spring Security 的架构

SpringSecurity架构

5.1、核心组件

核心组件

SecurityContext

  • 用来存储当前认证的用户的详细信息

SecurityContextHolder

  • 是一个工具类,它提供了对安全上下文的访问,默认情况下,它使用一个 ThreadLocal 对象来存储安全上下文,是线程安全的

Authentication

  • 存储了当前用户(与应用程序交互的主体)的详细信息
  • Principal 可以理解为用户的信息(比较简单的情况下,有可能是用户名)
  • Credentials 可以理解为密码
  • Authorities 可以理解为权限

5.2、认证

UserDetails 和 UserDetailsService

通常的场景下用户是具备一系列属性约束的,这就是 UserDetails

从数据存储中根据用户名找到用户,是由 UserDetailsService 定义的

这两个对象不负责认证工作,只是提供数据。所以一般我们都通过拓展它们来实现自定义的数据库结构

5.3、数据库的表结构和定制化

最基础的表只需要两个:用户表和角色表

最简单的自定义可以直接设置查询语句

系统内建了 JdbcUserDetailsManager,可以通过构造不同的 SQL 进行深度的定制化

实现自己的 UserDestails 和 UserDetailsService

6、Spring Security 认证过程解析

springsecurity认证过程

7、JWT概念

JWT 是 Jsoon Web Token 的缩写,基于 RFC 7519 标准定义,可以安全传输的小巧和自包含的 JSON 对象

使用数字签名的,所以是可信任的和安全的

使用 HMAC 算法进行加密或者 RSA 的公钥私钥对来进行签名

7.1、JWT 工作流程

JWT 工作流程

7.2、访问令牌和刷新令牌

访问令牌和刷新令牌

7.3、多因子验证

多因子验证

7.4、基于时间的一次性密码

基于时间的一次性密码

  • Copyrights © 2022-2023 hqz

请我喝杯咖啡吧~

支付宝
微信