【Spring Security】基于SpringBoot3.3.4版本整合JWT的使用教程

news2024/10/3 8:31:19

基于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.coloradmin.cn/o/2185873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

Leecode刷题之路第六天之Z字形变换

题目出处 06-Z字形变换 题目描述 个人解法 思路&#xff1a; todo 代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo 官方解法 06-Z字形变换官方解法 方法1&#xff1a;利用二维矩阵模拟 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&am…

Microsoft 更新 Copilot AI,未來將能使用語音並看到你瀏覽的網頁

不過受到 Recall 事件的影響&#xff0c;更新的推出將更緩慢謹慎。 Microsoft 也同步對其網頁版及行動版的 Copilot AI 進行大改版。這主要是為網頁版換上了一個較為簡單乾淨的介面&#xff0c;並增加了一些新的功能&#xff0c;像是 Copilot Voice 能讓你與 AI 助手進行對話式…

Ansible Playbook原理与实践(Principles and Practice of Ansible Playbook)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

环绕航线规划软件,适配大疆御3e、M300/350适用大疆机型: 经纬M300 rtk、M350rtk、御3e等行业机,能支持kml,㎞z导入。

环绕航线规划软件,适配大疆御3e、M300/350 适用大疆机型: 经纬M300 rtk、M350rtk、御3e等行业机,能支持kml,㎞z导入。 环绕航线规划软件介绍 名称 环绕航线规划软件 (Orbit Flight Planning Software) 适用机型 大疆经纬 M300 RTK大疆经纬 M350 RTK大疆御 3E 行业机功能特…

【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)

文章目录 【技术详解】SpringMVC框架全面解析&#xff1a;从入门到精通(SpringMVC)SpringMVC概述1. 三层架构与MVC架构区别1.1 三层架构1.2 MVC架构1.3前后端分离开发模式 2. SpringMVC环境搭建2.1 注解启动方式2.2 xml启动方式2.3 SpringMVC PostMan工具使用 3. SpringMVC 请求…

electron出现乱码和使用cmd出现乱码

第一种出现乱码。这种可以通过chcp 65001&#xff0c;设置为utf-8的编码。第二种&#xff0c;是执行exec的时候出现乱码&#xff0c;这个时候需要设置一些编码格式&#xff0c;可以通过iconv-lite进行解决&#xff0c;这个方法是node自带的&#xff0c;所以不需要导入。使用方法…

scrapy爬取汽车、车评数据【上】

这个爬虫我想分三期来写&#xff1a; ✅ 第一期写如何爬取汽车的车型信息&#xff1b; ✅ 第二期写如何爬取汽车的车评&#xff1b; ✅ 第三期写如何对车评嵌入情感分析结果&#xff0c;以及用简单的方法把数据插入mysql中&#xff1b; 技术基于scrapy框架、BERT语言模型、mysq…

【springboot】整合沙箱支付

目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后&#xff0c;看到以下页面&#xff0c;下…

2、.Net 前端框架:OpenAuth.Net - .Net宣传系列文章

OpenAuth.Net 是一个开源的身份验证框架&#xff0c;由开发者 Yubaolee 创建&#xff0c;它旨在简化 Web 应用和服务的安全授权过程。这个框架以其强大的功能和易用性&#xff0c;为开发人员提供了一种高效的方式来处理用户认证和授权问题。 OpenAuth.Net 的关键特性包括&#…

无头双向不循环链表的模拟

总共由四部分组成&#xff0c;一个拥有总体方法名参数 的接口、一个异常类、一个方法类、一个测试类 先看我们写入的接口 public interface ILinkList {// 2、无头双向链表实现//头插法void addFirst(int val);//尾插法void addLast(int val);//任意位置插入,第一个数据节点为…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

Unity Input System自动生成配置

参考视频 创建及配置新输入系统 New Input System&#xff5c;Unity2022.2 最新教程《勇士传说》入门到进阶&#xff5c;4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…

Ascend C 算子运行资源管理简介

Ascend C 算子运行资源管理简介 在 Ascend C 平台上开发深度学习应用时&#xff0c;运行资源的管理是一个核心知识点。通过合理管理算子执行中的计算资源&#xff0c;能够有效提升模型的执行效率和硬件利用率。本文将简要介绍 Ascend C 算子运行时的资源管理。 1. AscendCL 初…

draw.io创建自定义形状

Create custom shapes in draw.io using the text editor Reference draw怎么创建和编辑复杂的自定义形状 https://blog.csdn.net/u012028275/article/details/113828875 Create custom shapes in draw.io using the text editor

AMD发布首个AI小语言模型:6900亿token、推测解码提速3.88倍

AMD发布了自己的首个小语言模型(SLM)&#xff0c;名为“AMD-135M”。相比于越来越庞大的大语言模型(LLM)&#xff0c;它体积小巧&#xff0c;更加灵活&#xff0c;更有针对性&#xff0c;非常适合私密性、专业性很强的企业部署。 AMD-135小模型隶属于Llama家族&#xff0c;有两…

5分钟学会SPI

SPI 定义&#xff1a;SPI 是一种机制&#xff0c;允许用户在不修改现有代码的情况下扩展和替换特定服务的实现。它定义了一组接口&#xff08;Service Interfaces&#xff09;和一组实现&#xff08;Service Providers&#xff09;&#xff0c;使得应用程序可以动态加载和使用…

netty之Netty与SpringBoot整合

前言 在实际的开发中&#xff0c;我们需要对netty服务进行更多的操作&#xff0c;包括&#xff1b;获取它的状态信息、启动/停止、对客户端用户强制下线等等&#xff0c;为此我们需要把netty服务加入到web系统中。 MyChannelInitializer public class MyChannelInitializer ex…

[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过

官方框架&#xff1a; https://github.com/ultralytics/ultralytics yolov8官方最近推出yolov11框架&#xff0c;标志着目标检测又多了一个检测利器&#xff0c;于是尝试在windows下部署yolov11的tensorrt模型&#xff0c;并最终成功。 重要说明&#xff1a;安装环境视为最基…