最近想给自己的小系统搭建一个登录认证服务,最初是想着一套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的更多相关文章

  1. spring-security 登陆认证之初次探究

    首先,希望还对 spring-security框架完全不懂的新手 下载下Git源码. 引入到项目中.这个短文就是边看源码边聊的.也会启动下项目验证自己的推想. 一.登陆认证的登陆配置项 <for ...

  2. 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

    登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

  3. Spring集成shiro做登陆认证

    一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...

  4. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  5. API代理网关和OAuth2.0授权认证框架

    API代理网关和OAuth2.0授权认证框架 https://www.cnblogs.com/bluedoctor/p/8967951.html 1,授权认证与微服务架构 1.1,由不同团队合作引发的 ...

  6. Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理

    本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...

  7. 有登陆认证的情况下如何使用Wisdom RESTClient?

    访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...

  8. django-rest-framework登陆认证

    # -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2018/10/23 15:05 # @Email : : 192287802 ...

  9. ACL登陆认证

    前篇文章ACL授权实例介绍了授权,授权完成之后,就要进行认证.ACL的认证主要分为登陆认证与即时认证.所谓登录认证就是在用户登陆的时候,进行信息认证.根据用户Id,加载上来该用户所拥有的权限模块:而即 ...

随机推荐

  1. Output of C++ Program | Set 6

    Predict the output of below C++ programs. Question 1 1 #include<iostream> 2 3 using namespace ...

  2. spring boot @EnableWebMvc禁用springMvc自动配置原理。

    说明: 在spring boot中如果定义了自己的java配置文件,并且在文件上使用了@EnableWebMvc 注解,那么sprig boot 的默认配置就会失效.如默认的静态文件配置路径:&quo ...

  3. springmvc框架找那个@responseBody注解

    <%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...

  4. log4j漏洞的产生原因和解决方案,小白都能看懂!!!!

    核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止 产生原因 其实这 ...

  5. 服务器安装Centos7

    目录 一.安装 一.安装 1.开启虚拟机后会出现以下界面 Install CentOS 7 安装CentOS 7 Test this media & install CentOS 7 测试安装 ...

  6. ABP VNext框架基础知识介绍(2)--微服务的网关

    ABP VNext框架如果不考虑在微服务上的应用,也就是开发单体应用解决方案,虽然也是模块化开发,但其集成使用的难度会降低一个层级,不过ABP VNext和ABP框架一样,基础内容都会设计很多内容,如 ...

  7. 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN

    层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...

  8. 工厂为什么要进行计划排产,APS高级计划排程系统的优势作用是什么?

    我们每个人的指挥中心是大脑,大脑对我们身体发出各种各样的指令,不停的告诉我们身体去干什么. 那么,一个制造企业的指挥中心是哪里?工厂每天都会接到各种各样的订单,通过几百上千的工人,使用各种设备来生产. ...

  9. 资源相关视图(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 这里就扯到资源了,资源是啥意思?如果是教科书,怕又是有一个名词解释要背吧,吼吼--其实这个资源在这里的意思基本上猜就能猜到 ...

  10. Birt报表设置自定义的值

    比如数据库查出该字段的值有"no",有"yes",那么想要根据当是no是显示"未完成",当是yes时显示"已完成" 可以 ...