登陆认证框架:SpringSecurity
最近想给自己的小系统搭建一个登录认证服务,最初是想着一套oauth2权鉴就可以,但是发现这个oauth2只是权鉴,具体的登录认证需要由 SpringSecurity来进行实现。
也就是说SpringSecurity 主要就是用来进行用户名、密码认证的登录框架
然后看了一下 SpringSecurity,发现之前用过,但是只是用过,具体的流程不清楚。
趁这个机会,将SpringSecurity源码大体的整理看一下。
概述
SpringSecurity 的功能就是 认证、授权、防止伪造登录
其核心就是一组过滤链,通过各种的过滤器对请求进行过过滤,然后放行符合规则的请求。
具体流程可以看下图:

流程
从上面我们可以清楚的认知到,我们的请求是由多个过滤器过滤之后才能访问到具体的api 的,那么各个过滤器是怎么进行的合作的呢?
这章只说登录认证

1. AbstractAuthenticationProcessingFilter 过滤器
首先是 SpringSecurity一系列过滤器,然后走到AbstractAuthenticationProcessingFilter 这个过滤器,这个过滤器就是一个模版,主要是用来进行 识别是否是 认证请求,然后将不是认证请求到给到下一个过滤器的实现类(就是一组过滤器的串联)
这个过滤器中,主要的是doFilter方法,这个方法中requiresAuthentication 识别是否是认证请求,如果是,那么交给 attemptAuthentication 这个方法去处理,但是attemptAuthentication方法是抽象方法,需要子类去实现,然后我们就找到UsernamePasswordAuthenticationFilter 过滤器,也就是attemptAuthentication方法的具体实现类,也就是AbstractAuthenticationProcessingFilter的子类。
流程可以看图
2. UsernamePasswordAuthenticationFilter 过滤器
它实际上是处理 认证请求的过滤器,AbstractAuthenticationProcessingFilter的子类,真正实现类attemptAuthentication方法。
attemptAuthentication方法中,除了进行对请求中用户名、密码参数的处理外,核心的一行是this.getAuthenticationManager().authenticate(authRequest); 这个就是用 选择合适的 验证类来进行验证,从名称我们也能看出AuthenticationManager 是一个管理类,这个里面有多个AuthenticationProvider 对象。选择合适的验证就行。
但是这个getAuthenticationManager是一个接口,需要找到真正的实现类才行。
流程可以看图
3. ProviderManager 管理类
这个类就是真正选择具体的认证 类,authenticate方法遍历认证类,然后将请求中的用户名、密码进行验证的。
从上图可以看到,它就是对所有的认证类遍历,选择合适的进行。
provider.authenticate(authentication); 就是它的方法的核心代码。
但是AuthenticationProvider 也是一个接口,需要找其真正的实现类。
4. AbstractUserDetailsAuthenticationProvider(抽象类)
authenticate 方法的具体实现是AbstractUserDetailsAuthenticationProvider类实现的。
我们具体看authenticate 方法,然后发现这个方法,就是先去内存中检查,是否有这个用户名 和密码,如果没有在去调用retrieveUser方法,查找这个 用户名 和密码。

然后找到之后,在去调用additionalAuthenticationChecks 方法去验证 持久化中的(内存或者retrieveUser方法找到的用户名和密码)是否和请求中的用户名密码一致,如果是一致的,那么就调用additionalAuthenticationChecks 方法去验证。
但是retrieveUser 和 additionalAuthenticationChecks 方法都是抽象方法,具体的实现,是子类进行的。
5. DaoAuthenticationProvider(子类)
这个是AbstractUserDetailsAuthenticationProvider 的子类,实现了retrieveUser 和 additionalAuthenticationChecks 方法,我们可以看到两个方法:

注意看 this.getUserDetailsService().loadUserByUsername(username); 这个方法不就是我们自定义 获取真正的(也就是持久化 中)用户名 和 密码 时需要重写的方法么,返回的user 类,不就是UserDetails 这个类的子类么。
而且,我们在看additionalAuthenticationChecks 这个方法,不就是调用PasswordEncoder 类中的matches 方法去对比的么

至此,我们就将 SpringSecurity 用户登录验证流程走通了。
我们将这个进行一个串联
6. 串联

这里我们就将 SpringSecurity 中 用户验证 流程串联完成了,我们依据这个可以写定制一个流程去进行。下一章是 SpringSecurity 认证的 实践。
登陆认证框架:SpringSecurity的更多相关文章
- spring-security 登陆认证之初次探究
首先,希望还对 spring-security框架完全不懂的新手 下载下Git源码. 引入到项目中.这个短文就是边看源码边聊的.也会启动下项目验证自己的推想. 一.登陆认证的登陆配置项 <for ...
- 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架
登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架
- Spring集成shiro做登陆认证
一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- API代理网关和OAuth2.0授权认证框架
API代理网关和OAuth2.0授权认证框架 https://www.cnblogs.com/bluedoctor/p/8967951.html 1,授权认证与微服务架构 1.1,由不同团队合作引发的 ...
- Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理
本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...
- 有登陆认证的情况下如何使用Wisdom RESTClient?
访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...
- django-rest-framework登陆认证
# -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2018/10/23 15:05 # @Email : : 192287802 ...
- ACL登陆认证
前篇文章ACL授权实例介绍了授权,授权完成之后,就要进行认证.ACL的认证主要分为登陆认证与即时认证.所谓登录认证就是在用户登陆的时候,进行信息认证.根据用户Id,加载上来该用户所拥有的权限模块:而即 ...
随机推荐
- 前端知识,什么是BFC?
BFC全称是Block Formatting Context,即块格式化上下文.它是CSS2.1规范定义的,关于CSS渲染定位的一个概念.要明白BFC到底是什么,首先来看看什么是视觉格式化模型. 视觉 ...
- Spring中的InitializingBean与DisposableBean
InitializingBean顾名思义,应该是初始化Bean相关的接口. 先看一下该接口都定义了哪些方法: public interface InitializingBean { void afte ...
- OpenStack之七: compute服务(端口8774)
注意此处的bug,参考o版 官网地址 https://docs.openstack.org/nova/stein/install/controller-install-rdo.html 控制端配置 # ...
- Dubbo服务限流
为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流. Dubbo中能够实现服务限流的方式较多,可以划分为两 ...
- Dubbo提供者的异步执行
从前面"对提供者的异步调用"例子可以看出,消费者对提供者实现了异步调用,消费者线程的执行过程不再发生阻塞,但提供者对IO耗时操作仍采用的是同步调用,即IO操作仍会阻塞Dubbo的提 ...
- AOP中环绕通知的书写和配置
package com.hope.utils;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotatio ...
- 算法 A-Star(A星)寻路
一.简介 在游戏中,有一个很常见地需求,就是要让一个角色从A点走向B点,我们期望是让角色走最少的路.嗯,大家可能会说,直线就是最短的.没错,但大多数时候,A到B中间都会出现一些角色无法穿越的东西,比如 ...
- iterator 前++ 后++区别
for(iterator it = begin(); it != end(); ++it) 此处的 begin()<==>this->begin() 或者for(ite ...
- [BUUCTF]REVERSE——[FlareOn6]Overlong
[FlareOn6]Overlong 附件 步骤: 例行检查,32位程序,不懂是个啥 32位ida载入,main函数很简单 处理函数 sub_401000 程序只对unk_402008的28位进行了处 ...
- 【密码学】AES简单学习
欧拉函数 公式 φ(n)=(p-1)(q-1) 小于x并且和x互质的数的个数 相关概念 因数:a*b=c 那么就称 a.b 是 c 的因数 素数:一个数如果除了1与它本身之外没有其他的因数,那么 ...

