01-springsecurity数据库登录

news/2025/2/22 19:27:18/文章来源:https://www.cnblogs.com/rimliuhan/p/18731279

01 - SpringSecurity实现数据库登录

环境: springboot 3.4.2, springsecurity 6.4.2, mybatis 3.0.4

  • springsecurity中的UserDetails接口用于表示用户信息, 包含用户名、密码等信息。

  • UserDetailsService接口用于加载用户信息, 里边就这一个方法

    public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    

    SpringSecurity的过滤器链(FilterChainProxy)会拦截请求。登陆时主要的过滤器是UsernamePasswordAuthenticationFilter, 它负责处理用户名和密码的认证(从请求中提取用户名和密码,并将其封装为一个 UsernamePasswordAuthenticationToken 对象, 然后交由security内其他filter使用)。

    具体内部过程还是挺长的, 那我们能为springsecurity做什么呢?

    能做的不多, 主要是自定义一个类实现UserDetailsService接口, 重写它的loadUserByUsername方法, 我这里的UserService接口继承了UserDetailsService

该方法根据name从数据库中找到用户信息, 将其封装成一个User对象(注意这里的User类不是自己定义的, 而是SpringSecurity的User类, 它是UserDetails的实现类), 最后将这个对象返回给SpringSecurity。

SpringSecurity内部根据我们返回的userDetails对象和用户输入的用户名密码比对(当然中间也会有用户权限的审查, 也就是UserDetails里那些boolean方法的调用), 如果都通过了, 返回响应成功。

这里还要写一个SecurityConfig配置类, 注入PasswordEncoderBean, springsecurity内部会调用passwordEncoder将用户输入的密码进行加密, 将加密后的密码与我们返回的userDetails对象的密码比较(数据库中密码存的是密文, 密文和密文比较, 没毛病)。


总之, springsecurity有自己的一套用户概念, 自己的规则, 也可以自定义UserDetails的实现类, 将自己定义的User对象聚合进去。

然后loadUserByUsername方法返回自定义的类的对象


问题:

loadUserByUsername方法是根据用户输入的用户名从数据库中找对应的用户的, 如果重名怎么办?

  1. 不允许用户名重名, 注册时规定好。
  2. 允许重名, 但该方法的参数采用唯一标识如email、phone, 根据唯一标志从数据库中查找对应用户。

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

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

相关文章

【喜与悲】- 2025.2.22 晚

下图为《Balatro》中的一张小丑牌:【喜与悲】喜与悲可以重新触发所有打出的人头牌,是重新触发家族中的一员。但其特性也决定了其强度方差极大,有配合则强度很高,没有配合则纯浪费小丑位。但很少有小丑能与其配合,而能与其配合的小丑大多单独拎出来又不强。更多时候其几乎只…

莫队算法学习笔记

莫队算法的发明者是一个叫做 莫涛 的人,所以被称为莫队算法,简称莫队。 英语 Mos algorithm。 使用场景 莫队算法常常被用来处理多次区间询问的问题,离线处理询问(必须满足!!!)。 插叙:离线是一种得到所有询问再进行计算的方法,是很重要的思想。 对于这种“区间询问”…

参数-返回值-局部变量-数组

参数和局部变量没有本质区别,都是栈中的数据 参数时在函数调用前分配的值,局部变量是在函数调用时分配的值 参数 ebp+* 局部变量 ebp-* 赋值的本质是把运算结果放到某个内存里数组: 一堆连续存储的等宽数据

详细介绍java的线程池状态

一、详细介绍java的线程池状态 Java 中的线程池状态是 ThreadPoolExecutor 类内部管理的一个重要概念。线程池的状态决定了线程池的行为,例如是否接受新任务、是否处理队列中的任务、是否中断正在执行的任务等。 线程池的状态通过一个 AtomicInteger 变量(ctl)来表示,该变量…

[Java SE] Java静态代码块与静态属性的执行顺序

序 重要结论先说结论,再去观察实验现象,印证结论。静态变量初始化和静态代码块的执行顺序是:按照它们在类中出现的顺序进行的。代码实验 实验1import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class JavaStaticTest {private final static String VAR = &qu…

PyTorch TensorBoard 使用

这篇文章介绍如何在 PyTorch 中使用 TensorBoard 记录训练数据。 记录数据 初始化 在程序启动时创建 SummaryWriter 对象用于写入日志数据。 from torch.utils.tensorboard import SummaryWriter import datetime# 获取当前时间戳,一般以时间戳作为记录文件夹名称的一部分 tim…

Svelte 最新中文文档教程(16)—— Context(上下文)

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

微信小程序-授权获取手机号

前端 wxml <button name=phone class=phone value={{userInfo.phone}} wx:if="{{!userInfo.phone}}" bindgetphonenumber="getPhoneNumber" hover-class=none open-type=getPhoneNumber>点击获取 </button>js import { wxGetPhoneNumber } fr…

Linux 中xargs 中 -L和-n参数的差异

001、-L :按照换行符的数量来传递[root@PC1 dir1]# ls [root@PC1 dir1]# echo {0..9} 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# echo {0..9} | xargs -L 2 ## 利用echo生成一个1行的测试数据 0 1 2 3 4 5 6 7 8 9 [root@PC1 dir1]# seq 0 9 0 1 2 3 4 5 6 7 8 9 [ro…

【humanoid gym】关于在Issac gym里面PPO算法实现里transitions部分roll out storage的记录

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.1 在on_policy_runner.py文件夹下,初始化的地方:然后我们寻找定义的地方,在ppo.py文件夹下:其中参数num_transitions_per_env其…

Windows快速部署xxl-job.jar

1.在官网下载文件 https://gitee.com/xuxueli0323/xxl-job 2.在idea打开项目 3.修改maven版本,当前版本(2025/2/22)需要使用maven3.6.3+,maven地址:https://maven.apache.org/download.cgi maven版本过老的报错信息:Failed to execute goal org.apache.maven.plugins:mav…

复制浏览器网页文字 粘贴时却乱码的解决

本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法~本文介绍在复制网页内容后粘贴时,粘贴内容出现一个方框图案而不是当初复制内容的解决办法。最近,需要将谷歌地球引擎(Google Earth Engine,GEE)网页中的一段代码复制到另一个网页中…