最近做项目的时候用到了springsecurity,正如所有的spring工具一大堆xml配置文件,而且表单提交的url也是写好的j_spring_security_check,似乎所有的验证过程都封装好了让人不禁想探索它到底是如何实现验证的(这里要说明的是在配置中的ProviderManager类的List<AuthenticationProvider> providers属性也就是验证类型注入的是DaoAuthenticationProvider也就是最常用的数据库数据验证,其他的方式我没用过),显然springsecurity给我们留下了一个唯一的通道也就是userDetailsService这个类,我们需要做的就是自己写这个类的实现,这个类需要重写loadUserByUsername(String userName)方法,作用很明显就是通过username来查询数据库用户的信息,然后构建一个能被框架所使用的User对象,这个User对象包括账号,密码,是否被锁定,当然最重要的就是这个对象是否拥有登录的权限这个权限放在User对象中的Collection<GrantedAuthority> authorities这个集合中,在配置中我们可以配置页面需要什么样的权限比如拥有ROLE_ALERT才能登录,如果某个用户是可以被允许登录的,那我们就可以像这个集合中添加一个权限,比如authorities.add(new SimpleGrantedAuthority("ROLE_ALERT"))。

上面说的都是最基础的估计大家都比较熟悉,现在我们开始探索到底是如何将表单中的数据提交到后台跟数据库的密码做对比校验密码是否正确的呢?经过我的断点跟踪,我发现所有验证的入口就在org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 类中的attemptAuthentication()方法我们来看一下这个方法。

可以看到这里有一个obtainUsername(request)和obtainPassword(request),大家可以看一下这两个方法,很容易看出,这两个方法就是我们想要找的获取表单输入的用户名和密码的信息,然后通过这两个重要信息构建一个类型为UsernamePasswordAuthenticationToken的对象,然后将这个对象传入到authenticate()方法,显然这个方法就是实现验证的逻辑所在。要想知道这个方法的逻辑,我们必须先知道这个方法是哪个对象所有,所以我们先看一下这个this.getAuthenticationManager()方法得到的是什么:

得到的是UsernamePasswordAuthenticationFilter的父类AbstractAuthenticationProcessingFilter中的AuthenticationManager类型的属性authenticationManager,而这个属性相信大家都很熟悉了,因为我们我们在配置文件中写的ProviderManager正是AuthenticationManager接口的一个实现,也就是说我们其实是 将 PrividerManager 注入 到了AbstractAuthenticationProcessingFilter类中,而ProviderManager中有一个List<AuthenticationProvider> providers的属性,我们通过spring配置将
org.springframework.security.authentication.dao.DaoAuthenticationProvider 注入到 这个List中,ProviderManager的authenticate方法中可以看到其实是循环调用list
中的每一个子类的authenticate()方法我们使用的DaoAuthenticationProvider类型的验证调用的就是其父类AbstractUserDetailsAuthenticationProvider中的authenticate()方法,

而这个方法中的构建User的方法retrieveUser()则是由DaoAuthenticationProvider自己实现的,调 很清楚的可以看到这里调用了我们自己写的UserDetails的实现UserDetailsImpl的loadUserByUsername(String username)方法 返回一个User对象
retrieveUser()调用之后再调用additionalAuthenticationChecks()传入构建的User对象以及表单提交构建的UsernamePasswordAuthenticationToken对象,
additionalAuthenticationChecks()这个方法也是由DaoAuthenticationProvider自己实现

可以看到这里完成了最终的比对逻辑实现了密码的匹配从而实现校验密码的功能。

springsecurity3的验证过程相关推荐

  1. 制药行业验证过程中的偏差如何处理?

    制药企业进行验证活动时--可能会出现测试结果与验证目标不一致的情况,对于同一个不一致,不同的原因处理方式亦不同.对偏差进行分类管理,以不同的方法和流程区分对待,一方面能达到降低质量风险的目的,另一方面 ...

  2. C#发送邮件异常:根据验证过程,远程证书无效

    今天在做发送邮件功能时,开始用qq邮箱和163邮箱都可以正常发送,后再改用我公司的邮箱和smtp时竟然报错了. 异常提示-----"根据验证过程,远程证书无效",后来通过查询资料解 ...

  3. Kerberos验证过程

    参考文献: How the Kerberos Version 5 Authentication Protocol Works: Logon and Authentication SQL Kerbero ...

  4. ppp协议pap验证过程状态转移图_硬核分享|Crust 核心协议栈的设计与实现

    "Crust 实现了去中心化存储的激励层协议,适配包括 IPFS 在内的多种存储层协议,并对应用层提供支持.同时 Crust 的架构也有能力对去中心化计算层提供支持,构建分布式云生态.&qu ...

  5. Linux中ssh基于密匙的安全验证过程是怎样的?

    在Linux中,ssh是非常重要的存在,但很多人对"ssh"这个概念很模糊,听起来也很晦涩难懂,那么Linux ssh是什么?有什么用?这篇文章为你解答一下. SSH是一种协议.S ...

  6. VLink的简单验证过程

    VLink的验证过程: 全局配置完成后 R1的LSDB: 没有area2的三类LSA 通过在R2 的area1配置#vlink peer 3.3.3.3 在R3的area1 配置#vlink peer ...

  7. Android的证书验证过程

    说明:本文分析源码基于Android_8.1 (还在看代码和修改文章的阶段,有点乱,慢慢来-) 文章目录 0x01 系统证书 0x02 证书管理类 0x03 证书验证流程 3.1 建立安全的连接 3. ...

  8. 信用卡违约客户的预测模型的选择(二)验证过程

    验证过程 该数据集包含23个输入变量(input variable)和一个响应变量(response variable).该数据集来源于UCI machine learning repository, ...

  9. 关于The remote certificate is invalid according to the validation procedure(远程证书验证过程无效)的解决方案

    项目的需要,对接微信和支付宝支付的时候,特别在在windows 2003 服务器上,微信支付和支付宝支付时候都出现The remote certificate is invalid according ...

  10. vue12Jwt详解+JWT组成+JWT的验证过程+JWT令牌刷新思路+代码

    目录 1. JWT是什么 2. 为什么使用JWT 3. JWT的工作原理: 4. JWT组成 JWT结构原理图: JWT实际结构: 4.1 Header 4.2 Payload(负荷) 4.3 sig ...

最新文章

  1. mysql error104528000_腾讯云服务器CentOS安装JDK+Tomcat+MySQL详细步骤(以及遇到的各种坑)...
  2. 华为云+AI,视频分析全面进入智能时代
  3. 面试中必知必会的那些题——单链表倒置
  4. js对象序列化为json字符串
  5. 【工作经验分享】java图片转文字
  6. Chrome developer tool介绍(javascript调试)
  7. 使用staatus和defaultStatus属性改变状态栏信息
  8. 简历javaweb项目描述怎么写_java web软件工程师个人简历
  9. 说一下html5 drag api,HTML5 DragAPI
  10. n皇后问题 递归 C语言,n皇后问题 递归和非递归
  11. python利用opencv去除图片logo_用python+OpenCV去除图片水印
  12. 联想电脑如何改w ndows更新,电脑是否能升级到Windows 8.1 及支持Windows 8.1系统的机型汇总...
  13. 假事务之名,深入研究UNDO与REDO
  14. 以太坊性能优化:分片技术、雷电网络、Casper-下一代以太坊共识协议
  15. QML <2> Canvas 自定义绘制 网易云歌单封面实现
  16. 11 | 数据科学家80%时间都花费在了这些清洗任务上?
  17. java级别_Java中的四种访问级别
  18. PTA 7-46 请输出郑州轻工业大学OJ平台网址
  19. python 鼠标连点脚本
  20. 开源IM软件----rabbit

热门文章

  1. css中margin标记可以带一个、二个、三个、四个参数,各有不同的含义
  2. 柯特斯公式 | 数值积分
  3. js map遍历 修改对象里面的值_前端面试之你必须要懂的原生JS
  4. wireshark过滤指定ip的数据包
  5. Idea和Eclipse快捷键对比
  6. php phdfs扩展,hadoop HDFS的PHP扩展—PHDFS
  7. 微信AD密码输入显示服务器出错怎么回事呢,微信提示账户或密码错误,请重新输入,怎么办...
  8. 第二次作业:分布式版本控制系统Git的安装与使用
  9. 201521123033《Java程序设计》第3周学习总结
  10. 树莓派保持网络连接shell脚本