Spring Security系列之认证(Authentication)架构

news2024/11/15 13:31:27

文章目录

    • 架构主要组件
      • SecurityContextHolder
      • Authentication
      • AuthenticationManager
      • ProviderManager
      • AuthenticationProvider
      • AuthenticationEntryPoint
      • AbstractAuthenticationProcessingFilter

架构主要组件

  • SecurityContextHolder - SecurityContextHolder 是 Spring Security 存储 认证 用户细节的地方。
  • SecurityContext - 是从 SecurityContextHolder 获得的,包含了当前认证用户的 Authentication (认证)。
  • Authentication - 可以是 AuthenticationManager 的输入,以提供用户提供的认证凭证或来自 SecurityContext 的当前用户。
  • GrantedAuthority - 在 Authentication (认证)中授予委托人的一种权限(即role、scope等)。
  • AuthenticationManager - 定义 Spring Security 的 Filter 如何执行 认证 的API。
  • ProviderManager - 最常见的 AuthenticationManager 的实现。
  • AuthenticationProvider - 由 ProviderManager 用于执行特定类型的认证。
  • AuthenticationEntryPoint - 请求凭证,用于从客户端请求凭证(即重定向到登录页面,发送 WWW-Authenticate 响应,等等)。
  • AbstractAuthenticationProcessingFilter - 一个用于认证的基本 Filter。这也让我们很好地了解了认证的高层流程以及各部分是如何协作的。

SecurityContextHolder

Spring Security 的认证模型的核心是 SecurityContextHolder。它包含了SecurityContext。

在这里插入图片描述

  • SecurityContextHolder 是 Spring Security 存储用户 验证 细节的地方。Spring Security 并不关心 SecurityContextHolder 是如何被填充的。如果它包含一个值,它就被用作当前认证的用户。

Authentication

  • Authentication 接口在Spring Security中主要有两个作用。

    • 对 AuthenticationManager 的一个输入,用于提供用户为验证而提供的凭证。当在这种情况下使用时,isAuthenticated() 返回 false。
    • 代表当前认证的用户。你可以从 SecurityContext 中获得当前的 Authentication。
  • 认证(Authentication)包含了:

    • principal: 识别用户。当用用户名/密码进行认证时,这通常是 UserDetails 的一个实例。
    • credentials: 通常是一个密码。在许多情况下,这在用户被认证后被清除,以确保它不会被泄露。
    • authorities: GrantedAuthority 实例是用户被授予的高级权限。两个例子是角色(role)和作用域(scope)。

AuthenticationManager

  • AuthenticationManager 是定义 Spring Security 的 Filter 如何执行 认证 的API。返回的 认证是由调用 AuthenticationManager 的控制器(即 Spring Security的 Filter 实例)在 SecurityContextHolder 上设置的。如果你不与 Spring Security 的 Filter 实例集成,你可以直接设置 SecurityContextHolder,不需要使用 AuthenticationManager。
  • 虽然 AuthenticationManager 的实现可以是任何东西,但最常见的实现是ProviderManager。

ProviderManager

  • ProviderManager是最常用的AuthenticationManager的实现。ProviderManager 委托给一个 ListAuthenticationProvider实例。每个 AuthenticationProvider 都有机会表明认证应该是成功的、失败的,或者表明它不能做出决定并允许下游的 AuthenticationProvider 来决定。如果配置的 AuthenticationProvider 实例中没有一个能进行认证,那么认证就会以 ProviderNotFoundException 而失败,这是一个特殊的 AuthenticationException,表明 ProviderManager 没有被配置为支持被传入它的 Authentication 类型。
    在这里插入图片描述

AuthenticationProvider

  • 可以在 ProviderManager 中注入多个 AuthenticationProvider 实例。每个 AuthenticationProvider 都执行一种特定类型的认证。例如, DaoAuthenticationProvider 支持基于用户名/密码的认证,而 JwtAuthenticationProvider 支持认证JWT令牌。

AuthenticationEntryPoint

  • AuthenticationEntryPoint 用于发送一个要求客户端提供凭证的HTTP响应。
  • 有时,客户端会主动包含凭证(如用户名和密码)来请求资源。在这些情况下,Spring Security 不需要提供要求客户端提供凭证的HTTP响应,因为这些凭证已经被包括在内。
  • 在其他情况下,客户端向他们未被授权访问的资源发出未经认证的请求。在这种情况下, AuthenticationEntryPoint 的实现被用来请求客户端的凭证。 AuthenticationEntryPoint 的实现可能会执行 重定向到一个登录页面,用 WWW-Authenticate 头来响应,或采取其他行动。

AbstractAuthenticationProcessingFilter

  • AbstractAuthenticationProcessingFilter 被用作验证用户凭证的基础 Filter。在认证凭证之前,Spring Security 通常通过使用AuthenticationEntryPoint 来请求凭证。
  • 接下来,AbstractAuthenticationProcessingFilter 可以对提交给它的任何认证请求进行认证。

在这里插入图片描述

  1. 当用户提交他们的凭证时,AbstractAuthenticationProcessingFilter 会从 HttpServletRequest 中创建一个要认证的Authentication。创建的认证的类型取决于 AbstractAuthenticationProcessingFilter 的子类。例如,UsernamePasswordAuthenticationFilter从 HttpServletRequest 中提交的 username 和 password 创建一个 UsernamePasswordAuthenticationToken。
  2. 接下来,Authentication 被传入 AuthenticationManager,以进行认证。
  3. 如果认证失败,则为 Failure。
    • SecurityContextHolder 被清空。
    • RememberMeServices.loginFail 被调用。如果没有配置记住我(remember me),这就是一个无用功。
    • AuthenticationFailureHandler 被调用。
  4. 如果认证成功,则为 Success。
    • SessionAuthenticationStrategy 被通知有新的登录。
    • Authentication 被设置在 SecurityContextHolder 上。之后, SecurityContextPersistenceFilter 会将 SecurityContext 保存到 HttpSession 中。
    • RememberMeServices.loginSuccess 被调用。如果没有配置 remember me,这就是一个无用功。
    • ApplicationEventPublisher 发布一个 InteractiveAuthenticationSuccessEvent 事件。
    • AuthenticationSuccessHandler 被调用。

你知道的越多,你不知道的越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【tensorflow】连续输入的神经网络模型训练代码

【tensorflow】连续输入的神经网络模型训练代码 全部代码 - 复制即用 训练输出 代码介绍 全部代码 - 复制即用 from sklearn.model_selection import train_test_split import tensorflow as tf import numpy as np from keras import Input, Model, Sequential from keras.l…

try-catch-finally中的四大坑

目录 1.坑1:finally中使用return 2.坑2:finally中的代码好像“不执行” 3.坑3:finally中的代码“非最后”执行 4.坑4:finally中的代码真的“不执行” 在 Java 语言中 try-catch-finally 看似简单,但想要真正的“掌…

对现在的生活不满意?《围城》给你个人,婚姻,爱情的启示

杨绛先生在100岁感言的时候说,我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!百岁老人的感言,清晰透彻地道出了人生的真相。我们每个人都是生活于关系之中的,在错综复杂的…

华为OD机试真题 JavaScript 实现【找车位】【2023 B卷 100分】,附详细解题思路

一、题目描述 停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。 为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此…

【tensorflow】连续输入的线性回归模型训练代码

【tensorflow】连续输入的感知机模型训练 全部代码 - 复制即用 训练输出 代码介绍 全部代码 - 复制即用 from sklearn.model_selection import train_test_split import tensorflow as tf import numpy as np from keras import Input, Model, Sequential from keras.layers …

2023ciscn初赛 Unzip

参考&#xff1a; 奇安信攻防社区-2021深育杯线上初赛官方WriteUp-Web篇 1.打开环境 2.上传一个文件&#xff0c;得到以下源码&#xff0c;分析一下8 <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); //使用 PHP 内置函数…

【软考系统规划与管理师笔记】第7篇 IT服务运营管理

这章也基本上是纯概念&#xff0c;整体上来说系统规划与管理师考试&#xff0c;以概念记忆为主。课本上的知识点往往告诉我们该怎么做&#xff0c;但是如何确保执行到位&#xff0c;如何主动激发员工、客户执行到位&#xff0c;往往还是空白&#xff1f;&#xff0c;作为考试记…

Android ANR分析

ANR(Application Not Responding&#xff0c;即应用程序无响应)。在Android中&#xff0c;当应用程序在规定时间内没有处理完毕相应的事件,系统就会报出ANR。 ANR类型 InputDispatchingTimedOut&#xff1a;应用程序主线程在5s内没有完成用户的input事件ServiceTimeout&#…

小型企业社交完整指南(2023年)

目录 如何制定成功的社交媒体营销策略 1. 设定预算和目标 2. 确定你的目标受众 3.研究竞争对手 4.选择社交媒体网站 5.定义你的社交媒体品牌 6.制定内容策略 社交媒体营销指标 如何制定成功的社交媒体营销策略 有效的内容营销始于计划。以下是通过六个步骤制定企业…

数据备份- rclone ,Duplicity, restic,rsync

目录 Duplicity 安装 语法&#xff1a; 案例&#xff1a; Rclone 简介 安装 设置 命令语法 备份 同步 常用功能选项 常用参数 日志 文件过滤 常用命令 查看远程文件夹的体积占用大小 Restic Restic 支持的存储类型 安装 备份至本地 创建备份仓库 备份至云…

《安富莱嵌入式周报》第315期:开源USB高速分析仪,8GHz示波器开发, 600行C编写RISC-V内核,英特尔推出用于开发人员等宽字体,便携物联网监测器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1gV4y117UD/ 《安富莱嵌入式周报》第315期&#xff1a;开源USB…

618期间该如何入手数码好物,列举几款618值得入手的数码好物

跟不少数码爱好者一样&#xff0c;在618、双十一这种大型电商促销节日中&#xff0c;都会选择入手几款心仪且实用的数码好物毕竟产品的热度可以说是相当的在线&#xff0c;而明天就是618的最后一天了&#xff0c;为了赶紧抓住最后的脚步&#xff0c;下面我将给大家分享一些618值…

CefSharp89-winform浏览器(支持H264,MP3,MP4等音视频)x86体验

cef89.*-cefsharp89.*版本应用体验-浏览器 欢迎体验cefsharp-winform-浏览器版本更新方法**测试视频播放**正常![播放视频测试正常](https://img-blog.csdnimg.cn/263f7199ef3c4f1fba59302355e5372d.png)兼容性测试(html5test.com)下载地址其他版本参阅:欢迎体验cefsharp-wi…

华为OD机试之整数对最小和

整数对最小和 题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c; 并对取出的所有元素求和&#xff0c;计算和的最小值。 注意&#xff1a; 两…

网安等保 | 主机安全之CentOS8服务器配置优化与安全加固基线文档脚本分享

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

C语言解决“三天打鱼两天晒网”的问题?

中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打 鱼两天晒网”&#xff0c;问这个人在以后的某一天是“打鱼”还是“晒网”&#xff1f; 根据题意可以将解题过程分为三步&#xff1a; &#xff08;1&#xff09;计算从1990年1月1日开始至指定日…

Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?

目录 一、前言 二、那个午后 三、跟webpack构建产物到底哪里不一样&#xff1f; 1. 准备工作 2. 构建工具版本说明 3. 构建工具配置项说明 4. 构建产物 5. Vite 的原生模块化能力 6. “魔鬼藏在细节中” 四、总结 一、前言 对前端开发者来说&#xff0c;Vite 应该不算…

Gurobi解决优化问题

Gurobi1介绍 Gurobi是一种优化软件&#xff0c;用于解决各种数学规划和整数规划问题。它提供了高性能的数学规划求解器&#xff0c;可用于最大化或最小化目标函数的线性规划、混合整数规划、二次规划、约束规划等问题。 Gurobi具有强大的求解能力和高效的算法&#xff0c;可以…

SpringBoot+Durid+dynamic-datasource实现多数据源分布式事务

SpringBootDuriddynamic实现多数据源分布式事务 引言&#xff1a; 在现代的应用程序中&#xff0c;使用多个数据源来处理不同的业务需求已成为常态。然而&#xff0c;处理多数据源之间的分布式事务是一个复杂的问题。本文将介绍如何使用Spring Boot、Druid和dynamic-datasourc…

java娱乐新闻系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目wap

一、源码特点 java 娱乐新闻系统是一套完善的java web wap信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…