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

这篇具有很好参考价值的文章主要介绍了【工作记录】基于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.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,比较简单易懂,根据实际情况修改即可。

添加工具类

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Springboot3+微服务实现12306高性能售票系统

    💗博主介绍:全网CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者。 专注于Java、小程序技术领域和毕业项目实战💗 ✌Java、SSM+Vue、SpringBoot+Vue、NodeJS+Vue、微信小程序、Python、大数据、安卓。 你想要的我

    2024年02月20日
    浏览(74)
  • 【springboot3.x 记录】解决 springboot3 集成 mybatis-plus 报 sqlSession 异常

    2022-12-30,作者最新发布了 3.5.3.1 版本,不需要使用快照版本了 ========================= springboot3 已经发布正式版,第一时间尝鲜看看如何,但是在集成 mybatis-plus 最新版 3.5.2 的时候发现提示异常。 看来 springboot3 在注入这块做了调整,但目前 mybatis-plus 并没有适配到。 于是翻查

    2024年02月13日
    浏览(45)
  • 记录SpringBoot2.7.5升级SpringBoot3.0.0问题

    依赖配置好后,项目启动报错 报错内容如下: 发现是因为swagger版本问题,由于swagger需要springfox依赖,但是springfox版本过低 参考连接:How to run with spring boot 3.0.0-snapshot? 替换swagger为springdoc 相关配置 参考SpringBoot结合SpringDoc 问题一解决后继续报错 mybatis和mybatis-plus现在仍然不支持Sp

    2024年02月12日
    浏览(46)
  • 【springboot3.x 记录】关于Jakarta包无法引入的问题

    最近想将一些项目升级到springboot3.x和java17的时候,发现项目依赖中有Jakarta的包,但是代码标红提示没有相关的类,特此记录一下排查问题和最终解决问题的思路方法 因为之前有创建过 springboot3.x + java17 的项目,也运行正常。所以最近想着将一些旧项目也做一下update,但是不

    2024年02月04日
    浏览(46)
  • Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第二篇-前端模块搭建及单点登录的实现

    本文参考自 Springboot3+微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第(二)章——项目实现 的第二篇,详细讲解使用Vue3 + Vue CLI 实现前端模块搭建的过程,同时其中也会涉及一些前后端交互的实现,因此也会开发一些后端接口;搭建好前端页面后,

    2024年03月26日
    浏览(56)
  • 踩坑记录:SpringBoot3.x版本与Mybatis-Plus不兼容问题

    当使用3.x版本的SpringBoot结合Mybatis-Plus时版本不兼容就会报Property \\\'sqlSessionFactory\\\' or \\\'sqlSessionTemplate\\\' are required这个错误 解决方案有两种: 1.降低SpringBoot的版本 2.提高Mybatis-Plus的版本,注意要使用3.5.2之后的版本 

    2024年01月23日
    浏览(43)
  • SpringBoot SpringSecurity 介绍(基于内存的验证)

    SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘 SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动Spring Security。 目的:验证请求用户的身份,提供安全访问 优势:基于Spring,配置方便,减少大量代码 permitAll() 表示所匹配的 URL 任何人都允许访问

    2023年04月27日
    浏览(30)
  • springboot3 redis 实现分布式锁

    分布式锁介绍 分布式锁是一种在分布式系统中用于控制不同节点上的进程或线程对共享资源进行互斥访问的技术机制。 在分布式环境中,多个服务可能同时访问和操作共享资源,如数据库、文件系统等。为了保持数据的一致性和完整性,需要确保在同一时刻只有一个服务能

    2024年04月16日
    浏览(36)
  • 【SpringBoot3】使用 devtools 实现代码热部署

    Spring Boot DevTools是一组用于提高开发人员生产力,并加速Spring Boot应用程序开发的工具。它提供了一些功能,可以帮助开发人员更快速地构建应用程序,并减少常见的开发问题。 Spring Boot DevTools的主要作用包括: 自动重新加载 :当应用程序中的代码发生变化时,DevTools会自动

    2024年01月16日
    浏览(37)
  • 记录一次SpringBoot3+Nacos Config做配置中心时,No spring.config.import property has been defined的问题

    以下为报错信息: No spring.config.import property has been defined 启动时,控制台已经很明确的给出了一个标准的解决方案: Add a spring.config.import=nacos: property to your configuration. If configuration is not required add spring.config.import=optional:nacos: instead. To disable this check, set spring.cloud.nacos.config.import

    2024年02月11日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包