【工作记录】基于springboot3+springsecurity实现多种方式登录及鉴权(二)

前言

上篇文章介绍了基于springboot3+springsecurity实现的基于模拟数据的用户多种方式登录及鉴权的流程和代码实现,本文我们继续完善。

主要完善的点

主要通过如下几个点来完成优化和完善:

  1. 用户信息获取通过查询mysql数据库实现
  2. token生成方式使用jwt
  3. 用户信息存储及读取使用redis
  4. 完善过滤器用户及token校验逻辑
  5. 添加登出接口
  6. 其他部分内容简单调整和修改

说明: 以下所有内容均在上文代码基础上进行修改,有不正确的地方欢迎留言指出。

开始

pom.xml修改

添加如下依赖:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- Mybatis-Plus的核心依赖 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version> <!-- 根据实际可用版本号填写 -->
</dependency>
<dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>9.38-rc3</version>
</dependency>

结合上面的完善点,引入了如下jar包:

mysql-connector-java: 用于连接mysql数据库

spring-boot-starter-data-redis: 用于链接和操作redis,主要是为了存储和获取用户信息和token

mybatis-plus-spring-boot-starter: 用于操作数据库

nimbus-jose-jwt: 生成和验证jwt,当然也可以选择其他的jar包

需要注意的是如果使用的是springboot 3.2.0或者以上版本,需要修改mybatis-plus包的maven坐标, 否则在启动时会抛出异常。

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version>
</dependency>

抛出的异常信息如下:

java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.Stringat org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getTypeForFactoryBeanFromAttributes(FactoryBeanRegistrySupport.java:86) ~[spring-beans-6.1.2.jar:6.1.2]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:836) ~[spring-beans-6.1.2.jar:6.1.2]at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:620) ~[spring-beans-6.1.2.jar:6.1.2]at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:575) ~[spring-beans-6.1.2.jar:6.1.2]at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:534) ~[spring-beans-6.1.2.jar:6.1.2]at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:138) ~[spring-context-6.1.2.jar:6.1.2]at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:789) ~[spring-context-6.1.2.jar:6.1.2]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606) ~[spring-context-6.1.2.jar:6.1.2]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.1.jar:3.2.1]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) ~[spring-boot-3.2.1.jar:3.2.1]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:464) ~[spring-boot-3.2.1.jar:3.2.1]at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.1.jar:3.2.1]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1358) ~[spring-boot-3.2.1.jar:3.2.1]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1347) ~[spring-boot-3.2.1.jar:3.2.1]at com.zjtx.tech.security.demo.SecurityDemoApplication.main(SecurityDemoApplication.java:10) ~[classes/:na]

添加配置

新建application.yml

spring:datasource:url: jdbc:mysql://替换成实际数据库ip:端口/security_demo?serverTimezone=UTC&useSSL=falseusername: 实际数据库用户名password: 实际数据库密码driver-class-name: com.mysql.cj.jdbc.Driverhikari:poolName: Hikaridata:redis:host: 替换成redis的hostport: 替换成redis的端口database: 11timeout: 10000jedis:pool:maxIdle: 10minIdle: 1enabled: truemax-wait: 10000ms
# 以下配置可根据实际情况自行修改
mybatis-plus:mapper-locations: classpath:mapper/*.xmlconfiguration:map-underscore-to-camel-case: trueglobal-config:db-config:table-prefix: t_table-underline: trueid-type: assign_uuid

主要就是配置mysql、redis、mybatis-plus,比较简单易懂,根据实际情况修改即可。

添加工具类

jwt生成和验证的工具类 JwtTokenUtil.java

package com.zjtx.tech.security.demo.util;import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;
import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.SignedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.BadCredentialsException;import java.security.SecureRandom;
import java.util.Base64;
import java.util.Date;@Slf4j
public class JwtTokenUtils {/*** 创建一个Token* @param userId 用户ID* @return 生成的Token字符串* @throws Exception 如果创建Token过程中发生异常*/public static String createToken(String userId)throws Exception {JWSSigner signer = new MACSigner(Constants.TOKEN_JWT_SECRET_KEY);// 设置 JWT Claim Set(声明集)JWTClaimsSet claimsSet = new JWTClaimsSet.Builder().issuer(Constants.TOKEN_ISSUER).subject(userId).audience("client_" + userId).issueTime(new Date()).expirationTime(new Date(System.currentTimeMillis() + Constants.JWT_EXPIRE * 1000L)) // 有效期为7天,其实是最长7天,token不自动续期.notBeforeTime(new Date()).build();// 创建 SignedJWT 对象SignedJWT signedJwt = new SignedJWT(new JWSHeader.Builder(JWSAlgorithm.HS256).build(), claimsSet);// 使用签名器进行签名signedJwt.sign(signer);// 输出已签名的 JWTlog.info("Generated JWT: {}", signedJwt.serialize());return signedJwt.serialize();}/*** 检查Token是否有效* @param token 要检查的Token* @return Token的主体* @throws Exception 如果解析Token、验证签名或验证Token其他条件出现错误*/public static String checkToken</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634135.shtml

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

相关文章

Text:焦点切换文字颜色随之改变

按Tab键切换2段文字的焦点&#xff0c;哪段文字的焦点为true&#xff0c;则字体颜色变为红色。 import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("2.2 属性")Rectangle {Text {id: thislabeltext: qsTr("hello world")font.pixelSiz…

JAVA ORM Bee的设计模式分析

创建型 工厂模式&#xff08;Factory Pattern&#xff09; 日志工厂 LoggerFactory 静态工厂模式 *&#xff08;Static Factory&#xff09; BeeFactoryHelper 单例模式&#xff08;Singleton Pattern&#xff09; 使用单例模式管理系统的配置信息 HoneyConfig 建…

龙芯3A5000上使用腾讯会议

原文链接&#xff1a;龙芯3A5000上使用腾讯会议 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在龙芯3A5000处理器上安装使用腾讯会议的经验分享。随着远程工作和在线会议的普及&#xff0c;腾讯会议成为了许多人日常工作不可或缺的工具。而对于使用龙芯3A5000…

极客时间-《罗剑锋的 C++ 实战笔记》文章笔记 + 个人思考

极客时间-《罗剑锋的 C 实战笔记》文章笔记 个人思考 语言特性06 | auto/decltype&#xff1a;为什么要有自动类型推导&#xff1f; 语言特性 06 | auto/decltype&#xff1a;为什么要有自动类型推导&#xff1f; auto 在C 11 引入。 为什么说C是静态强类型语言&#xff1f…

Open3D 点云转深度图像

目录 一、算法原理1、算法过程2、主要函数二、代码实现三、结果展示1、点云2、深度图像四、测试数据Open3D 点云转深度图像由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。<

【JavaScript】 失去了eval时怎么办(表达式解析与求值深入解析)

JavaScript 表达式解析与求值深入解析 有的时候我们不得不面临不可使用eval函数或者new function&#xff0c;但是又需要将一个字符串作为代码运行的尴尬场景&#xff0c;比如小程序考虑到其安全性问题&#xff0c;就禁止使用&#xff1b;这种情况下我们就需要一个表达式解析器…

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…

Spring Cloud核心组件介绍

三大门派 有Spring Cloud的地方就有江湖&#xff0c;我们就来看一看在这个江湖中都有哪些独霸一方的门派! Netflix 是先有SpringCloud还是先有Netflix?这是一个好问题。Netflix是一家大名鼎鼎的互联网传媒公司&#xff0c;但为什么它在开源软件领域有这么大的名声呢?这就…

标题:智能对话新纪元:ChatGPT与文心一言的全面比较

标题&#xff1a;智能对话新纪元&#xff1a;ChatGPT与文心一言的全面比较 引言&#xff1a; 在这个由数据驱动的时代&#xff0c;人工智能语言模型已成为技术创新的前沿。特别是OpenAI的ChatGPT和百度的文心一言&#xff08;ERNIE Bot&#xff09;&#xff0c;它们不仅代表了…

如何在 Element Plus 中使用自定义 icon 组件 (非组件库内置icon)

先说原理就是将 svg 文件以 vue 组件文件的方式使用 需求&#xff1a;我想要在 Element Plus 得评分组件中使用自定义得图标。 el-rate v-model"value1" /> 组件本身是支持自定义图标的&#xff0c;但是教程中只说明了如何使用 element-plus/icons-vue 图标库内置…

常用的gpt-4 prompt words收集2

1. attended an English speaking class about traffic. 学习了关于…的英语口语课 2. I am a newbie at English. 我英语很菜 3. Please respond in Markdown format text. 请返回markdown格式的回答 4. That’s brilliant! / That’s the best idea I’ve heard all da…

vue3移动端调用手机摄像头实现扫描二维码功能

vue3移动端调用手机摄像头实现扫描二维码功能 需求&#xff1a; vue3vant4 实现移动端网页调用手机摄像头实现扫描二维码&#xff0c;并返回二维码附带信息功能 效果图&#xff1a; 实现方法 采用vue3-qr-reader插件实现 项目安装依赖&#xff1a; npm install --save vue3-…

慢查询定位

慢查询 使用工具 mysql自带慢日志 默认没有开启需要手动开启 查看慢日志中的文件 总结

第三讲_ArkTS的初识

ArkTS的初识 1. ArkTS的基本组成2. ArkTS自定义组件 1. ArkTS的基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。自定义组件&#xff1a;可复用的UI单元&#xff0c;可组合其他组件&#xff0c;图示中Component装饰的struct Hello…

路由综合实验-nat

一.要求 R2为ISP路由器&#xff0c;其上只能配置ip地址&#xff0c;不得再进行其他的任何配置 PC1-PC2可以ping通客户平板和DNS服务器; 客户端可以通过域名访问http1&#xff0c;通过地址访问HTTP2 R1为边界路由器&#xff0c;!其上只有一个公有ip地址 拓扑图&#xff1a; 子…

php怎么获取图片四个角的坐标 x y

使用PHP GD库来处理图像,记得查看是否安装 代码&#xff1a; <?php // 1. 加载图像文件 $image imagecreatefromjpeg(path/to/your/image.jpg); // 根据实际情况修改路径和格式// 2. 获取图像宽度和高度 $width imagesx($image); $height imagesy($image);// 或者直接…

代码随想录day10:栈与队列part01(用栈实现队列,用队列实现栈)

栈与队列part01 用栈实现队列 时间复杂度: push和empty为O(1), pop和peek为O(n) 空间复杂度: O(n) class MyQueue { public:stack<int> stIn; // 输入栈stack<int> stOut; // 输出栈MyQueue() {}void push(int x) {stIn.push(x);}int pop() {// 只有当输出栈为…

Visual SVN Server实战

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;下载Visual SVN Server&#xff08;二&#xff09;安装Visual SVN Server&#xff08;三&#xff09;使用Visual SVN Server1、新建仓库&#xff08;1&#xff09;新建Repository&#xff08;2&#xff09;选择仓库…

eNSP学习——配置通过Telnet登陆系统

实验内容&#xff1a; 模拟公司网络场景。R1是机房的设备&#xff0c;办公区与机房不在同一楼层&#xff0c;R2和R3模拟员工主机&#xff0c; 通过交换机S1与R1相连。 为了方便用户的管理&#xff0c;需要在R1上配置Telnet使员工可以在办公区远程管理机房设备。 为…

批量重命名软件,文件夹批量重命名

有时候为了整理或统一格式&#xff0c;我们需要对多个文件夹进行重命名。传统的重命名方式是一个一个来&#xff0c;既费时又费力。如果你还在用这种方式&#xff0c;那么你真的OUT了&#xff01;现在&#xff0c;有一个强大的工具可以帮你批量重命名多个文件夹&#xff0c;甚至…