第05篇_Spring_Security

第01章_SpringSecurity快速入门

第一节 Spring Security 简介

1. 什么是 Spring Security ?

Spring Security 是一个专注于为 Java 应用程序提供身份认证(Authentication)授权(Authorization)的框架。

 

 

2. 入门案例

1) 新建 Maven 工程

 

2) 主页视图

在路径 resources/templates 中创建index.html

注意:

  1. 资源地址使用 @{/资源地址} 引用,以适应不同的 Servlet 上下文路径

 

3) 主页接口

 

4) 启动应用测试

启动 SpringBoot 应用,在浏览器中访问:http://localhost:8080/,当未登录时,会自动跳转到登录页面:http://localhost:8080/login

默认登录用户为 user,登陆密码可在控制台的启动日志中查看,或者通过 SpringBoot 属性进行修改:

注意:

  1. 由于默认登录页面在线引用了 github.com 的 bootstrap.min.css 样式,可能会加载缓慢及样式缺失。

 

 

3. 工作流程

1) 拦截入口

Spring Security 底层是通过 Servlet 的 过滤器(Filter) 来拦截请求,并通过 SecurityFilterChain 来组装处理流程:

image-20241220190250816

 

2) 凭证比对

在使用用户名密码进行登录时,默认通过 SecurityFilterChain 中的 UsernamePasswordAuthenticationFilter 进行凭证比对

image-20241222200106113

image-20241222211246528

 

 

第二节 身份认证

1. 基于内存的身份认证

入门案例就是基于内存的身份认证,我们可以对 SpringSecurity 提供的 InMemoryUserDetailsManager进行自定义配置和注册:

注意:

  1. 自定义 UserDetailsService 后,spring.security相关属性配置需自行应用。

 

 

2. 基于数据库的身份认证

1) 数据库脚本

 

2) 数据库相关依赖

 

3) 数据源配置

 

4) DAO代码

 

5) DBUserDetailsManager

基于数据库的身份认证,需要自定义一个 UserDetailsManager (继承自UserDetailsService),以支持从数据查询用户名和密码等信息:

注意:

  1. UserDetailsManager中也可以增加删除用户,以及修改用户密码等。

 

6) Service代码

注意:

  1. SpringSecurity 默认使用基于自适应单向函数BCryptPasswordEncoder 进行密码加密。

 

7) Controller代码

 

8) 测试验证

启动 SpringBoot 应用,测试如下:

 

3. 自定义配置

新增配置类 WebSecurityConfig 如下,手动注册一个 SecurityFilterChain 来覆盖默认配置:

注意:

  1. SpringBoot 项目会根据 spring-security 依赖包自动配置 @EnableWebSecurity 注解。

 

4. 访问当前登录用户

访问http://localhost:8080/user/info 查询当前登录用户信息,返回 json 数据。

 

5. 自定义登录页(前后端不分离)

1) 登录页

新增登录页面 templates/login.html 如下:

 

2) 登录接口

 

3) 登录配置

修改登录配置信息如下:

 

6. 自定义登录页面(前后端分离)

1) 请求登录(表单)

image-20241222223447908

 

2) 登录/登出处理器

修改登录/登出配置如下:

 

3) 未认证请求处理

修改错误处理配置如下:

 

4) 会话管理

限制用户只能在 1 处登录如下:

修改会话管理配置如下:

 

 

第三节 用户授权

1. 授权管理

1) 授权管理简介

授权管理一般有如下两种模型:

 

2) 未授权请求处理

修改错误处理配置如下:

 

 

2. 基于 URL 的授权

1) 用户-权限-资源模式

在配置中开启授权保护如下:

在加载用户时设置用户权限如下:

测试结果和结论如下:

注意:

  1. 用户的权限以及各权限对应的资源一般在数据库配置并加载。

 

2) 用户-角色-权限-资源模式

在配置中开启授权保护如下:

在加载用户时设置用户权限如下:

此时,只有 ADMIN 角色的用户可以访问 /user/** 资源。

 

 

3. 基于控制器方法的授权

1) 开启注解配置

在配置类上开启基于控制器方法的授权:

 

2) 设置控制器方法访问权限

 

3) 给用户授予角色和权限

 

 

第四节 OAuth2+JWT

1. OAuth2+JWT简介

1) OAuth2简介

OAuth(Open Authorization) 是一个关于授权(authorization)的开放网络协议,允许用户授权第三方应用访问存储在其他服务提供者上的信息,并且不需要将用户名和密码直接提供给第三方应用。

它包括如下四个角色:

在这里插入图片描述

 

2) JWT简介

JSON Web Tokens(JWT)是一种基于 JSON 的开放标准(RFC 7519),一般被用来在身份提供者服务提供者之间传递被认证的用户身份信息,以便于从资源服务器获取资源。每个JWT都是经过数字签名的,因此可以被验证和信任。

image-20241224213619710

JWT通常包含三部分:

 

3) 其他资料

【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)-腾讯云开发者社区-腾讯云

深入 OAuth2.0 和 JWT_oauth2.0与jwt-CSDN博客

【鉴权】session、token、jwt、oauth2-支付宝开发者社区