Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter

认证过程如下
一、先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一个过滤器,是则进行校验。
二、验证用户密码信息并返回Authentication类,在验证过程中如果失败则捕获异常进行处理(执行unsuccessfulAuthentication方法调转到配置中的错误链接),如果验证成功,则将调用SessionAuthenticationStrategy中的方法onAuthentication()判断用户能否重复登陆,是否二次登陆——根据你的配置文件决定,如果用户登陆满足条件则再执行successfulAuthentication(配置中的验证成功链接),如果失败则还是执行unsuccessfulAuthentication方法
详细说明:
1、用户密码认证过程
AbstractAuthenticationProcessingFilter.doFilter()调用UsernamePasswordAuthenticationFilter中的attemptAuthentication方法,

UsernamePasswordAuthenticationFilter中的attemptAuthentication方法将表单请求的信息(用户、密码等信息)赋值给UsernamePasswordAuthenticationToken(authRequest),
然后调用getAuthenticationManager().authenticate(authRequest)对用户密码的正确性进行验证,认证失败就抛出异常,成功就返回Authentication对象。

AuthenticationManager就是认证管理器,它的方法authenticate执行逻辑如下(默认配置DaoAuthenticationProvider,以DaoAuthenticationProvider为例):
(1)、判断是否有Authentication 对应的AuthenticationProvider,
有就执行AuthenticationProvider的authenticate方法,
没有就获取父类AuthenticationManager,查看父类中是否有Authentication 对应的AuthenticationProvider,
如果也没有则抛出ProviderNotFoundException异常
(2)执行AuthenticationProvider的authenticate方法
1、根据输入名,查看缓存中是否已经有有用户实体对象
如果有,则对密码重新验证;
如果没有,则进行用户的信息验证,执行DaoAuthenticationProvider中的retrieveUser方法,获取一个UserDetails对象
如果UserDetails对象为null或者获取时出错就抛出异常UsernameNotFoundException或AuthenticationServiceException异常,
然后一些属性验证之后,对用户密码进行验证。
2、给新获取的UserDetails对象放入缓存中
3、新建一个UsernamePasswordAuthenticationToken一个对象,将authenticated设为true(原来传入的UsernamePasswordAuthenticationToken对象authenticated为false)并返回
2、SessionAuthenticationStrategy.onAuthentication处理过程(主要处理一个用户是否可以同时多次登陆)
1、checkAuthenticationAllowed方法
根据maximumSessions和exceptionIfMaximumExceeded的设置判断
用户是否多次登陆,
是否超过maximumSessions同时登陆了,
是否限制用户二次登陆(限制的话则第二次登陆的时候会抛出SessionAuthenticationException异常)还是第二次登陆使第一次登陆无效
2、复制一个新的session,拥有新的sessionID
3、更新SessionRegistry中的ConcurrentMap<Object,Set<String>> principals和Map<String, SessionInformation> sessionIds,这个是在第三个过滤器中ConcurrentSessionFilter需要使用的
2018-03-29总结
AuthenticationManager调用Provider,provider调用userDetaisService来根据username获取真实的数据库信息。
而在usernamePasswordAuthenticationFilter中来调用的是AuthenticationManager。。这个流程虽然没多么复杂,但是花费我不少时间给理解到了。。。
Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter的更多相关文章
- Spring Security 入门(3-11)Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter
认证过程如下 一.先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一 ...
- Spring Security 自定义登录认证(二)
一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...
- wordpress密码生成与登录密码验证
一.研究wordpress时wordpess的密码密码生成与登录密码验证方式很重要 WordPress密码已成为整合的首要目标,如何征服整合,就得了解WordPress密码算法. WordPress系 ...
- Spring Security源码解析一:UsernamePasswordAuthenticationFilter之登录流程
一.前言 spring security安全框架作为spring系列组件中的一个,被广泛的运用在各项目中,那么spring security在程序中的工作流程是个什么样的呢,它是如何进行一系列的鉴权和 ...
- Spring Security在登录验证中增加额外数据(如验证码)
在使用Spring Security框架过程中,经常会有这样的需求,即在登录验证时,附带增加额外的数据,如验证码.用户类型等.下面将介绍如何实现. 注:我的工程是在Spring Boot框架基础上的, ...
- 【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
在前面两节Spring security (一)架构框架-Component.Service.Filter分析和Spring Security(二)--WebSecurityConfigurer配 ...
- Spring Security 自定义登录页面
SpringMVC + Spring Security,自定义登录页面登录验证 学习参考:http://www.mkyong.com/spring-security/spring-security-f ...
- Spring Security 入门—内存用户验证
简介 作为 Spring 全家桶组件之一,Spring Security 是一个提供安全机制的组件,它主要解决两个问题: 认证:验证用户名和密码: 授权:对于不同的 URL 权限不一样,只有当认证的用 ...
- Spring Boot整合Spring Security自定义登录实战
本文主要介绍在Spring Boot中整合Spring Security,对于Spring Boot配置及使用不做过多介绍,还不了解的同学可以先学习下Spring Boot. 本demo所用Sprin ...
随机推荐
- Ubuntu 链接ln的使用:创建和删除符号链接
一 . 使用方式 ln [option] source_file dist_file (source_file是待建立链接文件的文件,dist_file是新创建的链接文件) -f 建立时,将同档案名删 ...
- TZ_10_spring-AOP日志处理
1.在某个用户登陆后台后对其每一项操作进行保存日志处理 LogAopController @Component @Aspect public class LogAop { @Autowired pri ...
- Hdu 1403(后缀数组)
题目链接 Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- PHP的安全性问题,你能说得上几个?
一.SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...
- LAMP环境搭建和配置(2)
配置httpd 默认虚拟主机 编辑hpptd的主配置文件 搜索httpd-vhost,把行首的#号删除 保存主配置文件,然后编辑虚拟主机配置文件 重新编辑配置段(第一段为默认虚拟主机) ServerA ...
- 链接的属性href=“?” ?该些什么及优缺点
<a onclick="{jscode}">是很常见的一种js运用方式,使用时经常会加一个href=“###”即<a onclick="{jscode} ...
- vue项目及插件
vue项目的创建 方法1: cmd中执行 vue ui vue会创建一个socket,方便快捷 方法2: 命令行建立 vue create v-proj //创建项目名为v-proj的项目文件 > ...
- MyBatis 动态sql标签trim
https://blog.csdn.net/zhangxing52077/article/details/75041053 序列序号在Mybatis中的使用的使用 将获得序列值获取返回到对象code字 ...
- 如何查看MySQL执行计划呢?
覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定 ...
- TP5.1 分页CSS样式(转载)
效果如图: 1.在extend\目录下创建page目录,在page目录中创建Page.php文件,将以下代码放入文件中 <?php namespace page; use think\Pagin ...