[SpringSecurity]基本原理_两个重要的接口_UserDetailsService接口和PasswordEncoder接口
UserDetailsService接口
当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的。而在实际项目中
账号和密码都是从数据库中查询出来的。 所以我们要通过自定义逻辑控制认证逻辑。
如果需要自定义逻辑时,只需要实现 UserDetailsService 接口即可。接口定义如下:
⚫ 返回值 UserDetails
这个类是系统默认的用户"主体"
以下是 UserDetails 实现类
// 表示获取登录用户所有权限
Collection<? extends GrantedAuthority> getAuthorities();
// 表示获取密码
String getPassword();
// 表示获取用户名
String getUsername();
// 表示判断账户是否过期
boolean isAccountNonExpired();
// 表示判断账户是否被锁定
boolean isAccountNonLocked();
// 表示凭证{密码}是否过期
boolean isCredentialsNonExpired();
// 表示当前用户是否可用
boolean isEnabled();
以后我们只需要使用 User 这个实体类即可!
⚫ 方法参数 username
表示用户名。此值是客户端表单传递过来的数据。默认情况下必须叫 username,否则无
法接收。
总结
UserDetailsService接口:查询数据库用户名和密码过程
- 创建类继承UsernamePasswordAuthenticationFilter,重写三个方法
- 创建类实现UserDetailService,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象
PasswordEncoder接口
数据加密接口,用于返回User对象里面密码加密
// 表示把参数按照特定的解析规则进行解析
String encode(CharSequence rawPassword);
// 表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹
配,则返回 true;如果不匹配,则返回 false。第一个参数表示需要被解析的密码。第二个
参数表示存储的密码。
boolean matches(CharSequence rawPassword, String encodedPassword);
// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回
false。默认返回 false。
default boolean upgradeEncoding(String encodedPassword) {return false; }
接口实现类:
BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析器,平时多使用这个解析
器。
BCryptPasswordEncoder 是对 bcrypt 强散列方法的具体实现。是基于 Hash 算法实现的单
向加密。可以通过 strength 控制加密强度,默认 10.
⚫ 查用方法演示
@Test
public void test01(){// 创建密码解析器
BCryptPasswordEncoder bCryptPasswordEncoder = new
BCryptPasswordEncoder();
// 对密码进行加密
String atguigu = bCryptPasswordEncoder.encode("atguigu");
// 打印加密之后的数据
System.out.println("加密之后数据:\t"+atguigu);
//判断原字符加密后和加密之前是否匹配
boolean result = bCryptPasswordEncoder.matches("atguigu", atguigu);
// 打印比较结果
System.out.println("比较结果:\t"+result);
}
[SpringSecurity]基本原理_两个重要的接口_UserDetailsService接口和PasswordEncoder接口相关推荐
- [SpringSecurity]基本原理_过滤器加载过程
过滤器如何进行加载的? 1.使用SpringSecurity配置过滤器 DelegatingFilterProxy 其中上面的getTargetBeanName()得到的名字是FilterChainP ...
- [SpringSecurity]基本原理_过滤器链
SpringSecurity 本质是一个过滤器链: 从启动是可以获取到过滤器链: org.springframework.security.web.context.request.async.WebA ...
- swift 组件化_打造完备的iOS组件化方案:如何面向接口进行模块解耦?
作者 | 黑超熊猫zuik,一个修行中的 iOS 开发,喜欢搞点别人没搞过的东西,钻研过逆向工程.VIPER 架构和组件化. 关于组件化的探讨已经有不少了,在之前的文章 iOS VIPER架构实践(三 ...
- Spring事务管理详解_基本原理_事务管理方式
Spring事务管理详解_基本原理_事务管理方式 1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象 ...
- 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包
烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包-内有短接点及教程 特点: 1.适用于对应型号的电视盒子刷机: 2.开放原厂固件屏蔽的市场安装和u盘安装apk: ...
- uboot 如何设置网关地址_两种网络地址段,如何设置内网和外网一起上?
一般企业都会有自己内部专用业务网络.及对外的互联业务两个网络,在具体使用过程中,根据业务类型的不同.部门职能的不同而分开使用两种网络. 但在使用过程中总会有特殊情况,就是一台电脑要同时使用两种业务网络 ...
- php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...
前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...
- uvc音频传输协议_干货|太全了!常见的音频接口,你知道几种?
导语:对于音频接口,大多数人是否又仅停留在3.5mm耳机孔的认知上,而看着一些播放器或者是专业设备上提供的其他接口,是否又感到莫名的头疼呢?事实上,任何音频接口都有着它自己独有的特性与功能,只有当我们 ...
- java迭代器删除两个_两个迭代器的故事
java迭代器删除两个 当您查看最流行的Java面试问题时,您可能会遇到有关故障快速和故障安全迭代器的问题: 故障快速迭代器和故障安全迭代器之间有什么区别? 简化的答案是: 如果在迭代过程中修改了集合 ...
最新文章
- pytorch nlp 语音识别任务如何进行数据加载
- pandas实现众数和众数的频数
- [YTU]_2635(P4 游戏中的Human角色)
- Entity Framework异步查询和保存
- 我也说说宏定义likely()和unlikely()
- c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)
- 每周个人进度总结02
- ROS学习笔记七:使用rqt_console和roslaunch
- Unity3D之Translate使用
- 【数据挖掘】关联规则和Apriori算法
- HDU5442 最小(大)表示法
- 创立仅一年GMV突破3亿!这个新锐品牌如何在快手实现爆发?
- unity 导出 ios 项目运行在模拟器
- 通信原理 | 滤波器:滤波器的概念、理想滤波器和实际滤波器
- 触动精灵和按键精灵哪个好,如何用按键精灵ios触动精灵及脚本写自动答题脚本...
- 电子防盗标签 之一:射频软标签 《转》
- 逐步实现一个简易的飞机大战(c++)
- 七大感触——You Only Live Once
- MIPI解决方案 ICN6202:MIPI DSI转LVDS转换芯片
- xshell连接不上虚拟机问题,前提:虚拟机和主机能ping通
热门文章
- Android之封装倒计时页面
- linux之dos2unix命令解决vi打开文件行尾巴显示^M
- 链表之删除双链表倒数第K个节点
- navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!
- c语言程序设计的顺序结构的常用控制语句,C语言程序设计教程-第03课-顺序结构的程序设计.ppt...
- 华为手机Android系统优缺点,第一次安卓机优缺点总结(对比iOS系统)
- 这道题号称无人能解!300多年来无一人答对,却让这群人这么简单就解出来了?...
- 每日一笑 | 各大互联网公司离职员工群名
- 借助TensorFlow框架,到底能做什么?
- 数学界的高冷之王,N次拒绝巨额奖金:我穷,但是我不缺钱。。。