文章目录

  • SpringSecurity用户认证设置用户名和密码的三种方式
    • 首先明白几个单词的意思:
    • SpringSecurity默认的用户认证
    • 1.通过配置文件进行用户认证
    • 2.通过配置类进行用户认证
      • There is no PasswordEcoder mapped for the id "null"异常
        • 异常出现原因
        • 解决办法
          • 在内存中存取密码方式
      • PasswordEncoder接口
    • 3.通过自定义编写用户细节实现类(需要查询数据库)进行用户认证
      • 数据库中的表
      • 数据库中的表对应的java bean实体类
      • 基于数据库自定义的用户细节实现类
      • UserDetailsService接口
      • SpringSecurity配置类

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

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

Authentication:认证

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

encoder:编译器

PasswordEncoder:密码编译器

SpringSecurity默认的用户认证

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

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

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

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

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

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

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

 // 自定义配置认证规则@Overrideprotected 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}encodedPasswordSuch 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配置类

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

  1. Spring Security (一) : 设置登录账号密码的三种方式

    首先新建一个SpringBoot工程 引入对应依赖 <dependency><groupId>org.springframework.boot</groupId>& ...

  2. linux设置开机自启服务,linux设置服务开机自启动的三种方式

    linux设置服务开机自启动的三种方式 这里介绍一下linux开机自动启动的几种方法,共计3种,大家可以借鉴一下!经验里面以centos 5.3系统为例! 方法1:.利用ntsysv命令进行设置,利用 ...

  3. 设置word只读模式的三种方式,分别如何取消只读模式?

    word文件可以设置只读模式,但是设置只读模式的方法不止有一种,今天和大家分享三种方式: 方式一: 这种只读模式仅起到提示功能,只是在打开文件时提示他人作者希望以只读方式打开,但是打开文件之后,我们还 ...

  4. Python与用户的交互 ,格式化输出的三种方式

    目录 Python与用户的交互 1.为什么交互? 格式化输出的三种方式 1.占位符 format格式化 f-String格式化 基本运算符 流程控制之if判断 1.语法 1.1 if 1.2 if.. ...

  5. android 加阴影,Android设置控件阴影的三种方式

    释放双眼,带上耳机,听听看~! 第一种方式:elevation View的大小位置都是通过x,y确定的,而现在有了z轴的概念,而这个z值就是View的高度(elevation),而高度决定了阴影(sh ...

  6. Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)

    一.有界面的程序自启动 利用Linux的 .desktop文件实现开机启动. 在/etc/xdg/autostart 目录下建立一个 test.desktop文件,并对文件进行以下编辑. 操作步骤 打 ...

  7. 【CSDN软件工程师能力认证学习精选】vue.js 三种方式安装(vue-cli)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  8. MySQL数据库修改用户登录密码的三种方式

    文章目录 一.更新 mysql.user 表 二.用 set password 命令 三.使用 mysqladmin 命令 提醒:MYSQL5.7 版本后不再支持password()函数和passwo ...

  9. mysql修改密码的三种方式

    方法1: 用SET PASSWORD命令 首先登录MySQL,使用mysql自带的那个客户端连接上mysql. 格式:mysql> set password for 用户名@localhost ...

最新文章

  1. 8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!
  2. freemarker程序开发
  3. 通过COS上传文件至腾讯云
  4. 源码安装mysql主从_mysql源码安装和主从同步配置
  5. SpringBoot是如何解析参数的
  6. java 并发编程框架
  7. sql文件转成json格式_10秒就能将任意格式的文件转成PDF,简单易操作,不学可别后悔...
  8. python画圆形螺旋线_中秋节到了,送你一个Python做的Crossin牌“月饼”
  9. Ubuntu 怎么安装AppImage文件 软件
  10. 【肌电信号】基于matlab带通滤波肌电信号处理【含Matlab源码 965期】
  11. Grasshopper不显示gha插件的解决方法
  12. 性能退化评估 matlab,LED驱动电源性能退化参数监测及寿命预测方法研究
  13. 树莓派Python3 使用定时器
  14. JS获取手机型号和系统类型
  15. 风控ML[15] | 风控模型报告以及上线后需要监控的内容
  16. 感谢网友,让我实现了Zbrush笔刷自由
  17. Bootstrap手机端下拉菜单(铺满)
  18. 用Python解中考数学规律题
  19. android studio在raw文件夹下使用MediaPlayer播放Mp3音乐
  20. 用cpp画出哆啦A梦

热门文章

  1. Macbook air(2012 MID)乞丐版升级——继续发挥余热
  2. 中考计算机加试及格多少分,中考满分多少,各科多少分
  3. 邵帝杀毒将全面取代sws安全中心
  4. 大数据背景下 个性化服务如何成功落地?
  5. 带你一步一步实现验证码登录和自动登录
  6. C offsetof
  7. 新版本的GPU(2080ti)与NVIDIA驱动(driver 440/cuda 10.2)安装旧版的tensorflow(1.6)
  8. nginx开启.b3dm压缩
  9. 一键生成原创视频软件 图片视频混剪制作!
  10. Axure RP 8.1.0.3372 下载+注册+汉化 整套教程