五、Spring Boot集成Spring Security之认证流程2
二、概要说明
- 上文已详细介绍了四、Spring Boot集成Spring Security之认证流程
- 本文则着重介绍用户名密码认证过滤器UsernamePasswordAuthenticationFilter的实现原理过程
- 认证管理器(authenticationManager)
- 认证提供者(AuthenticationProvider)
- 自定义配置用户名密码实现(UserDetailsService)
三、UsernamePasswordAuthenticationFilter
1、结构及作用
- 继承AbstractAuthenticationProcessingFilter
- 初始化请求地址
- 初始化authenticationManager
- 初始化successHandler
- 初始化failureHandler
- 实现过滤器入口doFilter方法
- doFilter方法调用抽象方法attemptAuthentication,attemptAuthentication供子类实现完成用户名密码验证业务
- 认证成功时更新安全上下文,并调用successHandler.onAuthenticationSuccess
- 认证失败时删除安全上下文,并调用failureHandler.onAuthenticationFailure
- 实现attemptAuthentication方法
- 从请求中获取用户名密码
- 生成未认证的Authentication
- 调用authenticationManager的authenticate方法完成用户名密码验证

四、认证管理器(AuthenticationManager)
1、作用
- 完成Authentication的认证
2、ProviderManager(默认实现)
- ProviderManager实现AuthenticationManager接口
- AuthenticationManager的作用的是完成Authentication的认证
- 但是ProviderManager并未直接完成Authentication的认证
- 而是提供一个AuthenticationProvider集合
- 遍历AuthenticationProvider集合来完成Authentication的认证
- 当需要多种认证方式时,可以注册自定义的AuthenticationProvider,后续介绍注册方式

五、AuthenticationProvider
1、作用
- 调用接口获取用户信息UserDetails
- 验证用户及密码是否可用
2、DaoAuthenticationProvider(默认实现)
- DaoAuthenticationProvider继承AbstractUserDetailsAuthenticationProvider实现AuthenticationProvider接口
- 调用retrieveUser方法获取用户信息UserDetails
- 调用userDetailsService.loadUserByUsername获取用户信息UserDetails
- 验证用户是否存在并可用,不存在或者不可用时抛异常(过期、锁定、启用)
- 验证密码是否可用,不可用时抛异常(为空、过期)
- 使用密码加密器校验密码(界面输入的密码和数据库已加密的密码)
- 密码不一致时抛异常

六、UserDetailsService
1、作用
- 通过用户名username获取用户信息UserDetails
- 返回用户信息UserDetails
2、InMemoryUserDetailsManager(默认实现)
- 项目启动时会默认生成一个用户名密码,存在内存中
- 通过用户名获取该用户并返回
3、推荐实现:自定义UserDetailsService
- 通过用户名从数据库中获取到用户
- 数据库用户转为UserDetails,数据库中未设置的属性像是否启用、账号未过期、密码未过期、账号未锁定直接设置为true即可
package com.yu.demo.service.impl;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
//@Autowired
//private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//TODO 通过username从数据库中获取用户,将用户转UserDetails
//User user = userService.getByUsername(username);
//return new User(username, user.getPassword(), user.getEnable(), user.getAccountNonExpired(), user.getCredentialsNonExpired(), user.getAccountNonLocked(), user.getAuthorities());
return new User(username, "123", true, true, true, true, AuthorityUtils.NO_AUTHORITIES);
}
}

五、Spring Boot集成Spring Security之认证流程2的更多相关文章
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- Spring Boot 集成 Spring Security 实现权限认证模块
作者:王帅@CodeSheep 写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领 ...
- Spring boot 集成Spring Security
依赖jar <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...
- Spring Boot 集成spring security4
项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (三)集成spring security,标记地址: htt ...
- Spring boot集成spring session实现session共享
最近使用spring boot开发一个系统,nginx做负载均衡分发请求到多个tomcat,此时访问页面会把请求分发到不同的服务器,session是存在服务器端,如果首次访问被分发到A服务器,那么se ...
- Spring Boot 集成 Spring Security
1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Spring Boot 集成 Spring Security 入门案例教程
前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot&l ...
- Spring Boot 集成 Spring Security 使用自定义的安全数据源
编写一个类自定义实现 UserDetailsService 接口 @Service("customUserDetailService") public class CustomUs ...
随机推荐
- 【转载】 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死——在pytorch中尽量不要使用opencv而是使用PIL
版权声明:本文为CSDN博主「时光碎了天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u013289254/ ...
- JUC高并发编程(二)之多线程下载支付宝对账文件
1.背景 在实际开发中,经常会遇到支付需求,当然就会有支付对账的需求.... 2.项目结构 3.代码 3.1.线程池配置对象 @Configuration @EnableAsync public cl ...
- 记一次 .NET某环境监测系统 崩溃分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序崩溃了,也自己分析了下初步结果,让我帮忙再确认下,既然让我确认,那就开始dump分析之旅吧. 二:WinDbg 分析 1. 为什么会崩溃 wi ...
- 关于没使用Mybatis 分页,分页sql默认执行count(0) 的问题
之前的Impl 的方法 :selectFromList(String uid, Integer pageNum, Integer pageSize) 之后的Impl 的方法 :selectFromLi ...
- Dijkstra单源最短路模板
struct DIJ { using i64 = long long; using PII = pair<i64, i64>; vector<i64> dis; vector& ...
- springboot之banner.txt
在springboot启动过程中,我们经常可以看到控制台打印下面图文: 实际上这个打印图文,是可以自定义的,可以在springboot的resource中创建一个banner.txt文件,在启动时就会 ...
- 从0实现基于Linux socket聊天室-多线程服务器模型-1
前言 Socket在实际系统程序开发当中,应用非常广泛,也非常重要.实际应用中服务器经常需要支持多个客户端连接,实现高并发服务器模型显得尤为重要.高并发服务器从简单的循环服务器模型处理少量网络并发请求 ...
- 如何使用4G模块通过MQTT协议传输温湿度数据到onenet
本次实验是采用SIM7600CE 4G cat4 模块进行操作的,本模块支持GNSS定位功能.也可以采用别的4G模块,只要支持TCP传输就行.本模块支持的AT命令相当强大,拥有TCP&UDP命 ...
- vscode使用说明
# 要经常保存 # centos打开vscode方式 普通用户:[bw@localhost ~]$ /usr/share/code/bin/code 超级用户:[root@localhost shar ...
- 2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需要按照以下规则进行 n 次操作,将数组 nums 中的所有元素分配到两个新数组 arr1 和
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n. 你需要按照以下规则进行 n 次操作,将数组 nums 中的所有元素分配到两个新数组 arr1 和 ...