SpringSecurity用户认证设置用户名和密码的三种方式

2023-10-26

SpringSecurity用户认证设置用户名和密码的三种方式

首先明白几个单词的意思:

Authentication:认证

AuthenticationManagerBuilder:身份验证管理器生成器

encoder:编译器

PasswordEncoder:密码编译器

SpringSecurity默认的用户认证

先来看一下假如用SpringSecurity默认的用户认证,用户名和密码是什么?

在这里插入图片描述

在这里插入图片描述

1.通过配置文件进行用户认证

在这里插入图片描述

下面来看一下SecurityAutoConfiguration.class自动配置类,如下图

在这里插入图片描述

下面再来看一下SecurityProperties.class类,如下图:

在这里插入图片描述

在这里插入图片描述

2.通过配置类进行用户认证

首先配置类需要继承WebSecurityConfigurerAdapter适配器类,WebSecurityConfigurerAdapter 类是个适配器, 在配置的时候,需要我们自己写个配置类去继承他,然后编写自己所特殊需要的配置。

在这里插入图片描述

也可以同时把多个用户信息以及它们的权限存到内存中,只需要在多个用户信息之间用and()方法连接就行了

 // 自定义配置认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("zhangsan").password("12345").roles("SuperAdmin")
                .and()
                .withUser("lisi").password("12345").roles("Admin")
                .and()
                .withUser("wangwu").password("12345").roles("Employee");

    }

There is no PasswordEcoder mapped for the id "null"异常

异常出现原因

下面重点描述一下上图中所说的There is no PasswordEcoder mapped for the id "null"异常,以及谈谈它的解决办法:

Spring security 5.0中新增了多种加密方式,也改变了默认的密码格式.

我们来看一下官方文档:

The general format for a password is:
{id}encodedPassword

Such that id is an identifier used to look up which PasswordEncoder should be used and encodedPassword is the original encoded password for the selected PasswordEncoder. The id must be at the beginning of the password, start with { and end with }. If the id cannot be found, the id will be null. For example, the following might be a list of passwords encoded using different id. All of the original passwords are "password".

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG 

{noop}password 

{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc 

{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=  

{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0

**这段话的意思是说,现如今Spring Security中密码的存储格式是“{id}…………”.前面的id是加密方式,id可以是bcrypt、sha256等,后面跟着的是加密后的密码.也就是说,程序拿到传过来的密码的时候,会首先查找被“{”和“}”包括起来的id,来确定后面的密码是被怎么样加密的,如果找不到就认为id是null.**这也就是为什么我们的程序会报错:There is no PasswordEncoder mapped for the id “null”.官方文档举的例子中是各种加密方式针对同一密码加密后的存储形式,原始密码都是“password”.

解决办法

需要修改一下configure中的代码,我们要将前端传过来的密码进行某种方式加密,Spring Security 官方推荐的是使用bcrypt加密方式.

在内存中存取密码方式

是这样的:

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

  //inMemoryAuthentication 从内存中获取

  auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("123")).roles("USER");

}

inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())",这相当于登陆时用BCrypt加密方式对用户密码进行处理.以前的".password(“123”)" 变成了 “.password(new BCryptPasswordEncoder().encode(“123”))”,这相当于对内存中的密码进行Bcrypt编码加密.如果比对时一致,说明密码正确,才允许登陆.

总结:在用户进行用户认证登录的时候,前端传来的密码会用BCrpt加密方式进行加密,加密后的密码格式是{id}password,然后程序员会先获取到加密方式也即是{id},假设没有写passwordEncoder(new BCryptPasswordEncoder())那么前端传来的值就不会用BCrpt加密方式进行加密,所以程序员获取前端传来的值时是寻找不到密码中的{id}也即是加密方式的,因此就会报There is no PasswordEcoder mapped for the id "null"异常。passwordEncoder(new BCryptPasswordEncoder())可以理解成是告诉系统到底用什么样的加密方式对前端传来的数据进行加密。假设程序中用了passwordEncoder(new BCryptPasswordEncoder())那么获取到用bcrypt加密方式的密码后会和内存中存储的用bcrypt方式进行加密的密码进行比较,如果相同那么说明用户输入的密码和内存中的密码一致,则允许登录。

PasswordEncoder接口

在这里插入图片描述

BCryptPasswordEncoder是PasswordEncoder接口的实现类
在这里插入图片描述

在对密码加密的时候需要调用相关的实现类如BCryptPasswordEncoder的encode方法,当用户在登录时,就会自动调用 matches 方法进行密码比对。

3.通过自定义编写用户细节实现类(需要查询数据库)进行用户认证

数据库中的表

首先先来看一下数据库中的users表,如下图:

在这里插入图片描述

数据库中的表对应的java bean实体类

在这里插入图片描述

基于数据库自定义的用户细节实现类

自定义的用户细节实现类如下图:

在这里插入图片描述

UserDetailsService接口

在这里插入图片描述

SpringSecurity配置类

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringSecurity用户认证设置用户名和密码的三种方式 的相关文章

随机推荐

  • Java 遍历集合时删除元素 快速失败和安全失败

    文章目录 遍历集合时删除元素 遍历集合时删除元素的五种操作 方式4分析 方式2和方式3分析 方式5分析 方式1分析 方式5再分析 快速失败和安全失败 快速失败 fail fast 安全失败 fail safe 附录 遍历集合时删除元素 遍历
  • Visual Studio 调试系列1 Debug 与 Release 模式

    系列目录 已更新最新开发文章 点击查看详细 Debug 模式 Debug 通常称为调试版本 它包含调试信息 并且不作任何优化 便于程序员调试程序 在Debug模式下调试 可以在断点处看到详细的调试提示信息 如下图 并且在输出目录中生成 De
  • vue3+ts使用websocket 实现实时推送消息

    因业务需要 做大屏页面某一处需要不断推送消息 采用websocket技术 1 新建socket ts 在utils文件夹下新建socket ts export default class Socket cb 存储回调函数 construct
  • 程序员会被 AI 替代吗?

    作者 阿文 责编 伍杏玲 出品 程序人生 coder life 程序人生 编者按 本文作者是运维工程师 为什么拥有IT技能的他会自称为 客服 的呢 一起来看看吧 客服 日常 笔者目前从事云计算行业的客户服务性岗位 虽然工作上需要用到各种技术
  • import引css,@import引入CSS文件的方法

    import引入CSS文件的方法 发布时间 2020 09 26 13 58 39 来源 亿速云 阅读 61 作者 小新 小编给大家分享一下 import引入CSS文件的方法 相信大部分人都还不怎么了解 因此分享这篇文章给大家参考一下 希望
  • Excel使用hlookup和offset实现动态查询报表

    文章目录 1 筛选器 2 hLookUp函数 3 sum offset函数 4 mod函数 效果图 数据源 文件下载 https download csdn net download diyangxia 85231108 1 筛选器 在年份
  • 排序

    桶排序 快 简单 但是浪费空间 memset num 0 sizeof num for int i 1 i lt n i scanf d t num t for int i 1000 i gt 1 i for int j 1 j lt a
  • 朴素贝叶斯(NaïveBayes)

    Author Silly 0903 Datawhale Na veBayes简介 基于贝叶斯方法 通过先验概率 计算并选择最大的后验概率 核心公式 P Y X
  • 脚本(自用)

    import pandas as pd import csv data1 pd read csv kong csv 必须添加header None 否则默认把第一行数据处理成列名导致缺失 data5 pd read csv kong11 c
  • Python中pass的作用

    空语句 do nothing 保证格式完整 保证语义完整 以if语句为例 在c或c java中 if true do nothing else do something 对应于python就要这样写 if true pass do noth
  • windows10域账号自动登录设置

    设置windows域账号自动登录 打开注册表regedit 打开HKEY LOCAL MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Winlogon并设置AutoAdminLogo
  • Ecovadis审核之【4大模块 7项原则 21项标准议题】

    Ecovadis企业社会责任涵盖内容 评估标准 参考模型 Ecovadis认证审计 四大主题模块 1 环境 2 劳工与人权 3 商业道德 4 可持续采购 Ecovadis认证审计之21项企业社会责任 CSR 标准 当评估一个公司的企业社会责
  • MySQL中基于InnoDB引擎的锁

    共享锁和排他锁 InnoDB实现了标准的行级锁 共享锁和排他锁 共享锁允许持有锁的事务读取一行 排他锁允许持有锁的事务更新或者删除一行 如果一个事务T1持有对第r行的共享锁 那么对于其他不同事务T2对第r行的锁请求处理方法如下 T2对于共享
  • 【教程】HTML快速学习

    教程 html快速学习 备注 一 HTML概述 二 标签 tag 三 HTML格式 四 注释 根标签 头部标签 1 注释 2 根标签 3 常见头部标签 五 常见主体标签 1 文本标题标签 heading 2 段落标签 p 3 功能标签 4
  • C++实现生产者和消费者模型

    C 实现生产者和消费者模型 C 实现生产者和消费者模型 1 实现细节 2 单生产者 单消费者模型 3 单生产者 多消费者模型 4 多生产者 单消费者模型 5 多生产者 多消费者模型 参考 C 实现生产者和消费者模型 1 实现细节 具体的实现
  • QT 多界面跳转以及窗口之间参数传递

    一 模式 之前一直用的是c 由于最近要使用CC来二次开发 所以先熟悉一下QT 1 从一个界面跳到另外一个界面不需要返回 2 从一个界面跳到另外一个界面需要返回 1 新增主窗口 二 窗口跳转 需要返回 主窗口 void MainWindow
  • 微信小程序之支付操作步骤

    视频教程链接 https www bilibili com video BV1nE41117BQ p 100 spm id from pageDriver 微信支付官方文档链接 https developers weixin qq com
  • SpringCloud系列之五---集中配置组件Config+消息总线Bus

    文章目录 前言 集中配置组件SpringCloudConfig 1 SpringCloudConfig 简介 2 配置客户端 3 配置服务端 4 测试 消息总线 SpringCloudBus 1 配置客户端 2 配置服务端 3 测试 前言
  • vue(7)虚拟DOM和diff算法

    虚拟DOM 虚拟DOM vnode 简单点来说就是用JS对象来模拟DOM结构 表达方式 将每一个标签都转为一个对象 这个对象有三个属性 tag props children tag 标签 也可以是组件 props 标签上的属性和方法 chi
  • SpringSecurity用户认证设置用户名和密码的三种方式

    文章目录 SpringSecurity用户认证设置用户名和密码的三种方式 首先明白几个单词的意思 SpringSecurity默认的用户认证 1 通过配置文件进行用户认证 2 通过配置类进行用户认证 There is no Password