SpringSeurity中文文档(Servlet Pre-Authentication Scenarios)

Pre-Authentication Scenarios

示例包括 X.509、Siteminder 以及 Java EE 容器中的身份验证,应用程序在这些环境中运行。当使用预身份验证时,Spring Security 必须执行以下操作:

  • 识别发出请求的用户。
  • 为用户获取权限。

具体的细节取决于外部认证机制。在 X.509 的情况下,用户可能通过他们的证书信息来识别,或者在 Siteminder 的情况下,通过 HTTP 请求头识别。如果依赖容器认证,用户是通过调用传入 HTTP 请求的 getUserPrincipal() 方法来识别的。在某些情况下,外部机制可能为用户提供角色和权限信息。然而,在其他情况下,您必须从单独的来源获取权限,例如 UserDetailsService。

Pre-Authentication Framework Classes

由于大多数预认证机制遵循相同的模式,Spring Security 有一组类,用于实现预认证身份验证提供程序的内部框架。这消除了重复,并允许以结构化的方式添加新的实现,而无需从头开始编写所有内容。如果您想使用像 X.509 认证这样的东西,您不需要知道这些类,因为它已经有了一个更简单、更易于使用的命名空间配置选项。如果您需要使用显式 bean 配置,或者计划编写自己的实现,您需要了解提供的实现是如何工作的。您可以在 org.springframework.security.web.authentication.preauth 下找到这些类。我们在这里只提供一个大纲,因此您应该适当地查阅 Javadoc 和源代码。

AbstractPreAuthenticatedProcessingFilter

这个类检查安全上下文当前的内容,如果为空,则尝试从 HTTP 请求中提取用户信息并将其提交给 AuthenticationManager。子类重写以下方法以获取这些信息。

Override AbstractPreAuthenticatedProcessingFilter

protected abstract Object getPreAuthenticatedPrincipal(HttpServletRequest request);

protected abstract Object getPreAuthenticatedCredentials(HttpServletRequest request);

调用这些方法后,过滤器将创建一个包含返回数据的 PreAuthenticatedAuthenticationToken 并提交进行身份验证。在这里,“身份验证”实际上只是指进一步的 processing,可能会加载用户的权限,但是遵循标准的 Spring Security 身份验证架构。

与其他 Spring Security 身份验证过滤器一样,预身份验证过滤器有一个 authenticationDetailsSource 属性,默认情况下,它创建一个 WebAuthenticationDetails 对象来存储额外的信息,比如会话标识符和原始 IP 地址,这些信息存储在 Authentication 对象的 details 属性中。在可以从预身份验证机制获取用户角色信息的情况下,数据也会存储在这个属性中,详细信息实现了 GrantedAuthoritiesContainer 接口。这使得身份验证提供者能够读取外部分配给用户的权限。我们接下来看一个具体的例子。

J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource

如果过滤器配置了 authenticationDetailsSource,且是本类的一个实例,权限信息将通过为每个预定义的“可映射角色”集合调用 isUserInRole(String role) 方法来获取。该类从配置的 MappableAttributesRetriever 获取这些信息。可能的实现包括在应用程序上下文中硬编码一个列表,以及从 web.xml 文件中的 信息读取角色信息。预身份验证示例应用程序使用了后一种方法。

还有一个额外的阶段,其中使用配置的 Attributes2GrantedAuthoritiesMapper 将角色(或属性)映射到 Spring Security GrantedAuthority 对象。默认情况下,它只是在名称前加上通常的 ROLE_ 前缀,但这为您提供了完全控制行为的能力。

PreAuthenticatedAuthenticationProvider

预认证提供者除了为用户加载 UserDetails 对象外,几乎没有更多的事情要做。它通过委托给一个 AuthenticationUserDetailsService 来完成这项工作。后者与标准的 UserDetailsService 类似,但它接受一个 Authentication 对象而不仅仅是用户名:

public interface AuthenticationUserDetailsService {
	UserDetails loadUserDetails(Authentication token) throws UsernameNotFoundException;
}

这个接口可能还有其他用途,但是,在预认证中,它允许访问封装在 Authentication 对象中的权限,正如我们在上一节中看到的。PreAuthenticatedGrantedAuthoritiesUserDetailsService 类就是这样做的。或者,它可以通过 UserDetailsByNameServiceWrapper 实现委派给一个标准的 UserDetailsService。

Http403ForbiddenEntryPoint

AuthenticationEntryPoint 负责为未经认证的用户启动认证过程(当他们尝试访问受保护的资源时)。然而,在预认证的情况下,这并不适用。只有当您不将预认证与其他认证机制结合使用时,您才需要配置 ExceptionTranslationFilter 与此类的一个实例。如果用户被 AbstractPreAuthenticatedProcessingFilter 拒绝,导致认证为 null,则会调用它。如果被调用,它总是返回一个 403-禁止的响应码。

Concrete Implementations

X.509 认证在其自己的章节中有所涉及。在这里,我们查看一些为其他预认证场景提供支持的类。

Request-Header Authentication (Siteminder)

外部认证系统可能通过在 HTTP 请求上设置特定头部来向应用程序提供信息。这种机制的著名示例是 Siteminder,它通过一个名为 SM_USER 的头部传递用户名。这种机制由 RequestHeaderAuthenticationFilter 类支持,它只从头部提取用户名。默认情况下,它使用 SM_USER 作为头部名称。请参阅 Javadoc 以获取更多详细信息。

Siteminder Example Configuration

下面的示例演示使用此筛选器的典型配置:

<security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>

<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
	<bean id="userDetailsServiceWrapper"
		class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
	<property name="userDetailsService" ref="userDetailsService"/>
	</bean>
</property>
</bean>

<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

我们在这里假设正在使用安全命名空间进行配置。还假设您已经向配置中添加了一个 UserDetailsService(名为 “userDetailsService”),以加载用户的角色。

Java EE Container Authentication

J2eePreAuthenticatedProcessingFilter 类从 HttpServletRequest 的 userPrincipal 属性中提取用户名。使用这个过滤器通常需要结合使用 Java EE 角色,正如前面在 J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 中所描述的。

在代码库中有一个使用这种方法的示例应用程序,因此如果您感兴趣,可以从 Github 获取代码并查看应用程序上下文文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM线上监控环境搭建Grafana+Prometheus+Micrometer

架构图 一: SpringBoot自带监控Actuator SpringBoot自带监控功能Actuator&#xff0c;可以帮助实现对程序内部运行情况监控&#xff0c;比如监控内存状况、CPU、Bean加载情况、配置属性、日志信息、线程情况等。 使用步骤&#xff1a; 1. 导入依赖坐标 <dependency><…

Omni3D目标检测

Omni3D是一个针对现实场景中的3D目标检测而构建的大型基准和模型体系。该项目旨在推动从单一图像中识别3D场景和物体的能力&#xff0c;这对于计算机视觉领域而言是一个长期的研究目标&#xff0c;并且在机器人、增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&a…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型&#xff08;本页updatexml()&#xff09; 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释&#xff1a; 第一个参数&#xff0c;意思就是xml文档的名称 第二个参数&#xff0c;意思就是定位到xml文档中指定…

PriorityQueue底层你了解多少?(带你彻底掌握优先级队列)

1. 概念 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如:在手机上玩游戏的时…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

D - Intersecting Intervals(abc355)

题意&#xff1a;有n个区间&#xff0c;找出俩俩区间相交的个数 分析&#xff1a; 设初始俩俩相交&#xff0c;找出不相交的&#xff08;不同区间l>r)&#xff0c;减去即可 #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ ios:…

大力出奇迹:大语言模型的崛起与挑战

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的出现与应用&#xff0c;彻底改变了我们与机器互动的方式。本文将探讨ChatGPT等大语言模型的定义、…

Hive-存储-文件格式

一、前言 数据存储是Hive的基础&#xff0c;选择合适的底层数据存储格式&#xff0c;可以在不改变Hql的前提下得到大的性能提升。类似mysql选择适合场景的存储引擎。 Hive支持的存储格式有 文本格式&#xff08;TextFile&#xff09; 二进制序列化文件 &#xff08;SequenceF…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

Fragment+Viewpage2+FragmentStateAdapter实现滑动式标签布局

大家好&#xff0c;我是网创有方&#xff0c;今天记录下标签布局的实现方法&#xff0c;先看下效果图。 第一步&#xff1a;编写一个activity或者fragment。内含有一个viewpager2的适配器&#xff0c;适配器类型为FragmentStateAdapter。 ​ public class MediaCreateFragment…

计算机图形学入门22:双向反射分布函数(BRDF)

1.定义 所谓BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff0c;双向反射分布函数&#xff09;&#xff0c;指的是从辐射度量学的角度去理解光线的反射&#xff0c;如下图所示。 所谓反射就是一个点从ωi方向发出的Radiance转化为dA接收到的功率E&am…

在jeesite框架中增加一个收藏夹功能-- V1.0版本

Jeesite简介&#xff1a;JeeSite 快速开发平台&#xff0c;不仅仅是一个后台开发框架&#xff0c;它是一个企业级快速开发解决方案&#xff0c;提供在线数据源管理、数据表建模、代码生成等功能。 正文&#xff1a;Jeesite是一个方便实用&#xff0c;适合敏捷开发&#xff0c;提…

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Webpack: 其他性能优化

概述 前面章节我们已经详细探讨 Webpack 中如何使用分包、代码压缩提升应用执行性能。除此之外&#xff0c;还有不少普适、细碎的方法&#xff0c;能够有效降低应用体积&#xff0c;提升网络分发性能&#xff0c;包括&#xff1a; 使用动态加载&#xff0c;减少首屏资源加载量&…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件&#xff0c;它提供了强大的图像编辑工具和智能自动化功能&#xff0c;包括图像修复、色彩校正和滤镜效果&#xff0c;以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

一维信号短时傅里叶变换域邻域降噪方法(MATLAB)

噪声在人类日常生活中无处不在,其会降低语音信号的质量和可懂度。在低信噪比的恶劣环境中,这种负面影响愈发严重。为了解决这个问题,众多研究人员在过去的几十年里提出了许多降噪算法。 根据原理的不同,降噪算法可大致分为五类:谱减法、最优滤波法、基于统计模型的方法、子空间…

Java案例打印乘法口诀表,三角形

目录 一问题&#xff1a; ​编辑二代码&#xff1a; 三运行结果&#xff1a; 四问题 二代码&#xff1a; 三运行结果&#xff1a; 一问题&#xff1a; 二代码&#xff1a; package 重修;import java.util.Random; import java.util.Scanner;public class first {public …

IDEA中Java源文件编译后class文件中文乱码

文章目录 一、设置 一、设置 路径&#xff1a;File -> Settings -> Bulid, Execution,Deployment -> Compiler -> Java Compiler

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

WordPress网站如何做超级菜单(Mega Menu)?

大多数的网站菜单都是像以下这种条状的形式&#xff1a; 这种形式的是比较中规中矩的&#xff0c;大多数网站都在用的。当然还有另外一种菜单的表现形式&#xff0c;我们通常叫做“超级菜单”简称Mega Menu。网站的超级菜单&#xff08;Mega Menu&#xff09;是一种扩展的菜单&…