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

Spring Security 自定义数据库认证(初尝试)

Spring Security 自定义数据库认证 学习笔记

适配个人实战案例:基于Spring Boot 3 + Spring Security 6 + MyBatis实现从MySQL数据库查询用户完成登录认证


一、学习目标

  1. 掌握 Spring Security 替换默认用户,使用数据库用户完成登录认证
  2. 理解UserDetailsService核心接口的作用
  3. 学会封装UserDetails用户信息对象
  4. 解决集成过程中的常见报错(空指针、类型转换、返回null等)

二、基础环境

1. 核心依赖

<!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis + MySQL --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

2. 配置文件(application.yml)

配置数据库连接,无需额外配置Security

spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/你的数据库?useSSL=falseusername:rootpassword:你的密码mybatis:mapper-locations:classpath:mapper/*.xml

三、核心代码实现

1. 数据库实体类(User)

com.sy.pojo.User对应数据库user表

@DatapublicclassUser{privateIntegerid;privateStringusername;privateStringpassword;privateStringrealName;privateStringphone;privateIntegerstatus;privateDatecreateTime;}

2. Mapper 层(数据查询)

  1. UserMapper接口
@MapperpublicinterfaceUserMapper{// 根据用户名查询用户(认证核心方法)UserfindByUsername(Stringusername);}
  1. XML映射文件
<selectid="findByUsername"resultType="com.sy.pojo.User">select * from user where username = #{username}</select>

3. Service 层(认证核心)

  1. UserService接口(继承Security核心接口)
publicinterfaceUserServiceextendsUserDetailsService{}
  1. UserServiceImpl实现类
@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateUserMapperuserMapper;/** * Security 认证核心方法:根据用户名加载用户信息 */@OverridepublicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{// 1. 从数据库查询用户Useruser=userMapper.findByUsername(username);// 2. 用户不存在,抛出异常if(user==null){thrownewUsernameNotFoundException("用户不存在");}// 3. 封装为Security要求的UserDetails对象并返回returnUser.withUsername(user.getUsername()).password(user.getPassword()).authorities(AuthorityUtils.NO_AUTHORITIES).build();}}

4. Security 配置类

配置密码加密器(Security强制要求)

@Configuration@EnableWebSecuritypublicclassSecurityConfig{// 密码加密:BCrypt算法@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}}

四、认证执行流程

  1. 用户提交登录表单 → Security 自动拦截
  2. 调用loadUserByUsername方法 → 根据用户名查数据库
  3. 返回UserDetails对象 → Security 自动比对密码
  4. 验证通过 → 登录成功;验证失败 → 报错

五、实战常见踩坑总结(重点)

报错信息错误原因解决方案
userMapper null未加@Service / @Mapper类上添加@Service、Mapper加@Mapper
类型转换异常自定义User不能直接返回封装为Security的User对象
UserDetails returned null方法最后return null必须return userDetails,禁止返回null
用户名不匹配登录账号和数据库不一致使用正确用户名登录

六、核心知识点

  1. UserDetailsService:Security认证的核心接口,自定义认证必须实现它
  2. UserDetails:Security规定的用户信息格式,必须封装后返回
  3. PasswordEncoder:密码加密接口,必须配置,否则无法认证
  4. 禁止返回nullloadUserByUsername查到用户必须返回对象,没查到抛异常
http://www.jsqmd.com/news/597154/

相关文章:

  • 2026山东大学软件学院项目实训(一)
  • 银泰百货卡回收的秘密:为什么你的卡竟然用不上? - 团团收购物卡回收
  • B站硬核会员AI自动答题神器:100题挑战轻松通关指南
  • 拼多多数据采集实战指南:用scrapy-pinduoduo轻松获取电商市场情报
  • 利用快马平台与claw hub框架,十分钟搭建新闻数据采集原型
  • C#串口通信与动态曲线绘制实现
  • Redis 从入门到精通(九):事务详解
  • Anaconda误删高级专题:Docker容器化与云环境下的环境灾难恢复
  • 解决绝地求生后坐力控制问题的罗技鼠标宏配置方案
  • LunaTranslator:视觉小说翻译的终极解决方案,5步开启你的无障碍游戏之旅
  • 瑞祥商联卡回收流程详解,一分钟快速上手! - 团团收购物卡回收
  • 实战应用:基于快马构建高保真抖音模块,为技术方案选型与竞品分析提供实例
  • 新手福音:借力快马平台,从opencode案例轻松上手第一个网页项目
  • OpenCore智能重构:黑苹果EFI配置的效率革命与技术突破
  • 【优化设计】基于人工蜂群算法机械设计优化附Matlab代码
  • Kandinsky-5.0-I2V-Lite-5s开源模型优势:可私有化部署+数据不出域+定制化扩展
  • 3 个月烧掉 $20K Token,我们用 AI 重构了 pandas 兼容生态
  • 解锁Sony相机潜能:PMCA-RE工具全方位技术指南
  • 如何通过正规渠道回收沃尔玛购物卡并快速变现? - 团团收购物卡回收
  • 百度网盘秒传革命:3分钟掌握文件瞬间转移的黑科技
  • Windows媒体播放终极解码方案:LAV Filters完整指南
  • PointPillars:基于柱状体编码的3D点云目标检测革命性方案
  • WorkshopDL:跨平台Steam创意工坊下载解决方案技术解析
  • 如何用Python突破裁判文书网反爬?Scrapy爬虫的终极解决方案
  • 打造你的专属数字伙伴:BongoCat虚拟桌宠完全指南 [特殊字符]
  • FLUX.1-dev实战体验:一键部署,实测生成效果有多惊艳
  • OpenXR Toolkit终极指南:3步解锁VR性能新境界
  • 深入解析基本放大电路:从概念到性能指标的全面指南
  • 4个突破级Unity插件开发指南:从痛点解决到生态构建
  • 别再到处找瓦片服务地址了!手把手教你用OpenLayers 7.x集成天地图和高德地图(附完整代码)