【Spring Security】基于SpringBoot3.3.4版本整合JWT的使用教程
基于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