当前位置: 首页 > article >正文

【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.3OpenJDK也选择最新的一个LTS版本21IDE也选择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,然后AuthenticationProviderUsernamePasswordAuthenticationToken进行认证

增加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

http://www.kler.cn/news/330841.html

相关文章:

  • HBase批量写入优化
  • 安宝特分享 | AR技术重塑工业:数字孪生与沉浸式培训的创新应用
  • Android SystemUI组件(08)睡眠灭屏 锁屏处理流程
  • 用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项
  • 【CSS/HTML】圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
  • db-gpt部署问题
  • 【数据库】 MongoDB 撤销用户的角色和权限
  • leetcode-32. 最长有效括号
  • 软件测试学习笔记丨Mock的价值与实战
  • centos7系统安装宝塔面板
  • C++之多线程
  • 14.数据结构与算法-栈的表示和实现(顺序栈和链栈)/栈和递归
  • C/C++进阶(一)--内存管理
  • Java-并发基础
  • Nacos笔记
  • 论文笔记(四十七)Diffusion Policy: Visuomotor Policy
  • 【C++复习】C++11经典语法
  • 将模板引擎用于 Express
  • 65 注意力分数_by《李沐:动手学深度学习v2》pytorch版
  • 前端开发技术框架选型