当前位置: 首页 > news >正文

(源码分析)springsecurity认证授权

了解

1. 结构总览

 SpringSecurity所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。

根据前边知识的学习,可以通过Filter或AoP等技术来实现,SpringSecurity对web资源的保护是靠Filter实现的,所以从这个Filter来入手,逐步深入SpringSecurity 原理。当初始化SpringSecurity时,会创建一个名为SpringSecurityFilterChain的 Servlet过滤器,类型为org.springframework.security.web.FilterChainProxy,它实现了javax.servlet.Filter,因此外部的请求会经过此类,下图是 Spring Security过虑器链结构图:

 

上图说明:

FilterchainProxy是一个代理,真正起作用的是FilterChainProxy中securityFilterChain所包含的各个Filter,同时这些Filter作为Bean被Spring管理,它们是SpringSecurity核心,各有各的职责,但他们并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器AuthenticationManager决策管理器AccessDecisionManager。进行处理下图是 FilterChainProxy相关类的UML图示:

 2. 过滤器链中主要的几个过滤器及其作用

2.1 SecurityContextPersistenceFi1ter

这个Filter是整个拦截过程的入口和出口(也就是第一个和最后一个拦截器),会在请求开始时从配置好的 SecurityContextRepesitory中获取SecurityContext,然后把它设置给securityContextHolder。在请求完成后将SecurityContextHolder持有的SecurityContext再保存到配置好的SecurityContextRepository ,同时清除securityContextHolder所持有的SecurityContext。

2.2 UsernamePasswordAuthenticationFilter

用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的AuthenticationSuccessHandler和AuthenticationFailureHandler,这些都可以根据需求做相关改变。

2.3 FilterSecurityInterceptor

是用于保护web资源的,使用AccessDecisionManager对当前用户进行授权访问。

2.4 ExceptionTranslationFilter

能够捕获来自Filterchain所有的异常,并进行处理。但是它只会处理两类异常:AuthenticationException和 AccessDeniedException,其它的异常它会继续抛出。

3. Spring security 认证工作流程

3.1 认证流程图

 

查询数据库进行比对。

查询用户信息的代码--->UserDetailsService中loadUserByUsername该方法。 我们只需要重写该方法即可。

相关文章:

  • 简单三步,帮你的照片重现高清,一键拯救摄影废片!
  • STM32——GPIO(点亮LEDLED闪烁)
  • Android中的usescleartexttraffic属性详解
  • 《学会 SpringBoot · 参数校验》
  • MyBatis基本工作原理
  • vue3中父子组件的双向绑定defineModel详细使用方法
  • Redis(三)
  • 27、美国国家冰雪中心(NSIDC)海冰密集度月数据下载与处理
  • MFC窗口大小最大化最小化随拖动调整大小
  • Golang | Leetcode Golang题解之第283题移动零
  • 【Go系列】Go的UI框架Fyne
  • SQL Server中非结构化数据的存储神器:文件表的魔力
  • 21 B端产品经理之技术常识(1)
  • Python | Leetcode Python题解之第284题窥视迭代器
  • Alternating Sum
  • Centos6.8 使用rpm安装mysql5.7
  • co.js - 让异步代码同步化
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • MySQL几个简单SQL的优化
  • Python3爬取英雄联盟英雄皮肤大图
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud Feign的两种使用姿势
  • SSH 免密登录
  • 每天10道Java面试题,跟我走,offer有!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 事件委托的小应用
  • 首页查询功能的一次实现过程
  • 学习HTTP相关知识笔记
  • 1.Ext JS 建立web开发工程
  • 2017年360最后一道编程题
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #《AI中文版》V3 第 1 章 概述
  • $.ajax,axios,fetch三种ajax请求的区别
  • (10)STL算法之搜索(二) 二分查找
  • (2022 CVPR) Unbiased Teacher v2
  • (k8s中)docker netty OOM问题记录
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计ssm电影分享网站
  • (三)uboot源码分析
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)从 Java 代码到 Java 堆
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • *2 echo、printf、mkdir命令的应用
  • .aanva
  • .Net Web窗口页属性