前言
上篇文章介绍了基于springboot3+springsecurity实现的基于模拟数据的用户多种方式登录及鉴权的流程和代码实现,本文我们继续完善。
主要完善的点
主要通过如下几个点来完成优化和完善:
- 用户信息获取通过查询mysql数据库实现
- token生成方式使用jwt
- 用户信息存储及读取使用redis
- 完善过滤器用户及token校验逻辑
- 添加登出接口
- 其他部分内容简单调整和修改
说明: 以下所有内容均在上文代码基础上进行修改,有不正确的地方欢迎留言指出。
开始
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.String
at 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=false
username: 实际数据库用户名
password: 实际数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
poolName: Hikari
data:
redis:
host: 替换成redis的host
port: 替换成redis的端口
database: 11
timeout: 10000
jedis:
pool:
maxIdle: 10
minIdle: 1
enabled: true
max-wait: 10000ms
# 以下配置可根据实际情况自行修改
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
table-prefix: t_
table-underline: true
id-type: assign_uuid
主要就是配置mysql、redis、mybatis-plus,比较简单易懂,根据实际情况修改即可。文章来源:https://www.toymoban.com/news/detail-804670.html
添加工具类
jwt生成和验证的工具类 JwtTokenUtil.java文章来源地址https://www.toymoban.com/news/detail-804670.html
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);
// 输出已签名的 JWT
log.info("Generated JWT: {}", signedJwt.serialize());
return signedJwt.serialize();
}
/**
* 检查Token是否有效
* @param token 要检查的Token
* @return Token的主体
* @throws Exception 如果解析Token、验证签名或验证Token其他条件出现错误
*/
public static String checkToken</
到了这里,关于【工作记录】基于springboot3+springsecurity实现多种方式登录及鉴权(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!