基于Spring Boot 3.3.4,详细说明Spring Security 6.3.3的使用
- 摘要
- 本地开发环境说明
- 先快速完整一个微服务的搭建
-
- pom.xml依赖
- 启动类
- 修改tomcat默认端口
- 增加Spring Security依赖
- 简单介绍下Spring Security涉及的一些概念
-
- 加密器
- UserDetailsService接口
- AuthenticationProvider接口
- AuthenticationManager接口
- 增加JWT依赖
-
- 为什么选择nimbus-jose-jwt这个开源库呢?
- 新增启动配置类
- 登录Controller
- 编写RSA工具类
-
- JWT与RSA公私钥
- 编写RSAUtils
- UserDetails实现类
- UserDetailsService实现类
- 校验JWT过滤器
- 启动工程
- 测试
-
- 测试登录接口
- 接口响应
- 测试校验JWT接口
- 接口响应
- 总结
摘要
Spring Boot框架版本在持续迭代中,Spring相关组件也在不断更新,JDK版本的发布频率也更加的频繁。做为一名持续学习的开发者,紧跟技术时代潮流,持续学习新技术,持续更新自己的技能储备,是往前冲锋的必备能力和品质。希望大家跟我一样,保持对技术的渴望,保持学习的激情,一起努力吧。
JWT也是现在前后端分离主流的身份认证载体,在本文中,我们会循序渐进从Spring Boot框架起步,一步步整合JWT,使用RSA公钥、私钥对JWT进行签名和验签,一点点揭开Spring Security的神秘面纱。
现在微服务开发主流的是Spring Boot框架,要开发一个微服务,其中一个非常重要的环节就是登录认证,Spring Boot针对登录认证原生有一套解决方案,对应的组件是Spring Security。接下来,让我们一步步在最新的框架版本中一起学习如何使用Spring Security完成后端微服务的登录认证吧。
本文选择目前Spring Boot最新版本3.3.4,里面使用的Spring Security版本是6.3.3,OpenJDK也选择最新的一个LTS版本21,IDE也选择IntelliJ IDEA目前最新的社区版本2024.2.3。
本地开发环境说明
开发用到的主要框架、工具版本如下
| 开发依赖 | 版本 |
|---|---|
| Spring Boot | 3.3.4 |
| Spring Security | 6.3.3 |
| nimbus-jose-jwt | 9.41.1 |
| JDK | 21 |
| IntelliJ IDEA | 2024.2.3 |
先快速完整一个微服务的搭建
pom.xml依赖
核心内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.wen3.framework-demo</groupId>
<artifactId>wen3-framework-springsecurity-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
启动类
package com.wen3.security.springsecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author tangheng
*/
@SpringBootApplication
public class DemoSpringSecurityApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringSecurityApplication.class, args);
}
}
修改tomcat默认端口
server:
port: 8081
这样就完成了一个最简单的Spring Boot 3.3.4版本的微服务搭建,接下来我们一点点增加内容
增加Spring Security依赖
核心内容如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
简单介绍下Spring Security涉及的一些概念
为了方便大家对Spring Security有一些基本了解,把涉及的一些重要概念单独拿出来讲解一下,希望对大家理解Spring Security的流程有些帮助。
加密器
- 主要用于用户密码的加密。
- 接口:
org.springframework.security.crypto.password.PasswordEncoder - 常用的实现类:
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder BCryptPasswordEncoder使用了较复杂的加密算法,每次生成的加密串都不一样,大大提高了破解难度
UserDetailsService接口
- 接口:
org.springframework.security.core.userdetails.UserDetailsService - 主要用于用户信息获取,根据账号查找用户信息,然后交由调用者进行密码等重要信息的匹配,通常需要自己实现这个接口,一般从数据库获取用户信息
AuthenticationProvider接口
- 接口:
org.springframework.security.authentication.AuthenticationProvider - 对用户信息进行校验,校验通过后提供用户凭证
Authentication,对校验过程提供丰富的扩展支持 - 常用的实现类:
org.springframework.security.authentication.dao.DaoAuthenticationProvider - 这个实现类会从
UserDetailsServic获取用户信息
AuthenticationManager接口
- 接口:
org.springframework.security.authentication.AuthenticationManager - 认证管理器,对
Authentication进行认证 - 默认是创建
org.springframework.security.authentication.ProviderManager实例,然后ProviderManager再去找AuthenticationProvider,然后AuthenticationProvider对UsernamePasswordAuthenticationToken进行认证
增加JWT依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.41.1</version>
</dependency>
</dependencies>
为什么选择nimbus-jose-jwt这个开源库呢?
- 因为在
Spring Security的其它组件中,使用的也是这个JWT库,比如spring-security-oauth2-authorization-server - 为了与
Spring Boot框架体系保持一致,在讲解Spring Security与JWT整合的时候,我们也首选nimbus-jose-jwt开源库 nimbus-jose-jwt开源库也使用当前最新版本9.41.1
新增启动配置类
了解完了Spring Security的几个核心概念,我们开始编写代码,先编写一个启动配置类,用于配置Spring Security,如下
package com.wen3.security.springsecurity.autoconfigure;
import com.wen3.security.springsecurity.filter.JwtFilter;
import com.wen3.security.springsecurity.filter.JwtTokenAuthenticationFilter;
import com.wen3.security.springsecurity.filter.LoginAuthenticationFilter;
import com.wen3.security.springsecurity.service.DemoDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto



















![[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过](https://i-blog.csdnimg.cn/direct/039d294b13854248a4a636bfcffeba0e.png)