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

SpringSecurity中文文档(Servlet Anonymous Authentication)

Anonymous Authentication

Overview

通常认为采用“默认拒绝”立场是良好的安全实践,您明确指定允许的内容并拒绝其他所有内容。定义未经身份验证的用户可以访问的内容是类似的情况,特别是对于 Web 应用程序。许多网站要求用户必须经过身份验证才能访问除少数 URL(例如主页和登录页面)之外的内容。在这种情况下,最简单的方法是为这些特定 URL 定义访问配置属性,而不是为每个受保护资源定义。换句话说,有时默认要求 ROLE_SOMETHING 并只允许对此规则的某些例外情况是很好的,例如应用程序的登录、注销和主页。您还可以将这些页面完全从过滤器链中省略,从而绕过访问控制检查,但这可能出于其他原因而不希望这样做,尤其是如果页面对于已认证用户的行为不同的话。

这就是我们所说的匿名身份验证。请注意,一个“匿名认证”的用户和一个未认证的用户之间在概念上没有真正的区别。Spring Security 的匿名身份验证只是为您提供了一个更方便的方式来配置您的访问控制属性。对 servlet API 的调用,例如 getCallerPrincipal,仍然返回 null,即使实际上 SecurityContextHolder 中有一个匿名身份验证对象。

在其它情况下,匿名身份验证也很有用,比如当一个审计拦截器查询 SecurityContextHolder 以识别哪个主体负责某个操作时。如果类知道 SecurityContextHolder 总是包含一个 Authentication 对象,而永远不会包含 null,那么这些类可以被编写得更健壮。

Configuration

当您使用 HTTP 配置时(Spring Security 3.0 中引入),会自动提供匿名身份验证支持。您可以使用 元素来自定义(或禁用)它。除非您使用传统的 bean 配置,否则您无需配置这里描述的 beans。

三个类共同提供匿名身份验证功能。AnonymousAuthenticationToken 是 Authentication 的一个实现,它存储适用于匿名主体的 GrantedAuthority 实例。有一个相应的 AnonymousAuthenticationProvider,它被链入 ProviderManager,以便接受 AnonymousAuthenticationToken 实例。最后,一个 AnonymousAuthenticationFilter 被链在正常身份验证机制之后,并自动向 SecurityContextHolder 添加一个 AnonymousAuthenticationToken,如果那里没有现有的 Authentication。过滤器和身份验证提供者定义如下:

<bean id="anonymousAuthFilter"class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
<property name="key" value="foobar"/>
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
</bean><bean id="anonymousAuthenticationProvider"class="org.springframework.security.authentication.AnonymousAuthenticationProvider">
<property name="key" value="foobar"/>
</bean>

密钥在过滤器和身份验证提供者之间共享,以便前者创建的令牌可以被后者接受。

在这里,使用 key 属性不应被视为提供了任何真正的安全性。它仅仅是一种簿记练习。如果您在可能由认证客户端构建 Authentication 对象的场景中(例如,使用 RMI 调用)共享包含 AnonymousAuthenticationProvider 的 ProviderManager,那么恶意客户端可以提交它自己创建的 AnonymousAuthenticationToken(带有选择的用户名和权限列表)。如果密钥可以被猜测或者被发现,那么令牌将被匿名提供者接受。这对于正常使用来说并不是问题。然而,如果您使用 RMI,您应该使用一个自定义的 ProviderManager,该提供者管理器省略了匿名提供者,而不是共享您用于 HTTP 认证机制的提供者管理器。

userAttribute 以 usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority] 的形式表示。InMemoryDaoImpl 的 userMap 属性在等号后面使用相同的语法。

如前所述,匿名身份验证的好处是所有 URI 模式都可以应用安全性,如下例所示:

<bean id="filterSecurityInterceptor"class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
<property name="securityMetadata"><security:filter-security-metadata-source><security:intercept-url pattern='/index.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/hello.htm' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/logoff.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/login.jsp' access='ROLE_ANONYMOUS,ROLE_USER'/><security:intercept-url pattern='/**' access='ROLE_USER'/></security:filter-security-metadata-source>" +
</property>
</bean>

AuthenticationTrustResolver

匿名身份验证讨论的最后一部分是 AuthenticationTrustResolver 接口,以及其相应的 AuthenticationTrustResolverImpl 实现。这个接口提供了一个 isAnonymous(Authentication) 方法,允许感兴趣的类考虑到这种特殊类型的认证状态。ExceptionTranslationFilter 在处理 AccessDeniedException 实例时使用这个接口。如果抛出了 AccessDeniedException 并且认证是匿名类型的,过滤器不会抛出 403(禁止)响应,而是启动 AuthenticationEntryPoint,以便主体可以正确地进行认证。这是一个必要的区别。否则,主体总是被视为“已认证”,并且永远不会有机会通过表单、基本、摘要或其它一些正常认证机制登录。

我们经常看到在早期的拦截器配置中,ROLE_ANONYMOUS 属性被替换为 IS_AUTHENTICATED_ANONYMOUSLY,这在定义访问控制时实际上是相同的东西。这是使用 AuthenticatedVoter 的一个例子,我们在授权章节中会介绍它。它使用一个 AuthenticationTrustResolver 来处理这个特定的配置属性,并授予匿名用户访问权限。AuthenticatedVoter 方法更强大,因为它可以让您区分匿名、记住我和完全认证的用户。然而,如果您不需要这个功能,您可以坚持使用 ROLE_ANONYMOUS,它由 Spring Security 的标准 RoleVoter 处理。

Getting Anonymous Authentications with Spring MVC

SpringMVC 使用自己的参数解析器解析主体类型的参数。

这意味着像这样的构造:

@GetMapping("/")
public String method(Authentication authentication) {if (authentication instanceof AnonymousAuthenticationToken) {return "anonymous";} else {return "not anonymous";}
}

即使对于匿名请求,也将始终返回“非匿名”。原因是 Spring MVC 使用 HttpServletRequest#getPrincipal 解析参数,而当请求是匿名时,该参数为 null。

如果您希望获得匿名请求中的身份验证,请改为使用@CurrentSecurityContext:

Use CurrentSecurityContext for Anonymous requests

@GetMapping("/")
public String method(@CurrentSecurityContext SecurityContext context) {return context.getAuthentication().getName();
}

相关文章:

SpringSecurity中文文档(Servlet Anonymous Authentication)

Anonymous Authentication Overview 通常认为采用“默认拒绝”立场是良好的安全实践&#xff0c;您明确指定允许的内容并拒绝其他所有内容。定义未经身份验证的用户可以访问的内容是类似的情况&#xff0c;特别是对于 Web 应用程序。许多网站要求用户必须经过身份验证才能访问…...

【Spring Boot 事务管理】

Spring Boot 事务管理 一、Spring Boot中的事务管理1.声明式事务管理Transactional注解基本使用配置选项 2.编程式事务管理TransactionTemplatePlatformTransactionManager 二、Transactional注解深入1.基本使用基本属性 2.传播行为3.隔离级别4.事务超时设置5.回滚规则 三、事务…...

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…...

安全隔离上网的有效途径:沙箱

在数字化浪潮日益汹涌的今天&#xff0c;网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制&#xff0c;为企业和个人提供了一种在享受网络便利的同时&#xff0c;保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网&#xff0c;从而为用户提…...

jenkins下后台运行链接Jenkins服务脚本方法

为了编写一个用于在后台运行 Jenkins agent 的批处理脚本&#xff0c;你可以使用 start 命令来启动 Java 进程并将其设置为在后台运行。以下是一个示例批处理脚本 run_agent.bat&#xff1a; bat echo off setlocalREM Set the path to the Jenkins agent JAR file set AGENT…...

宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐

养猫确实给家庭带来了无尽的欢乐&#xff0c;但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫&#xff0c;它们掉落的浮毛飘浮在空气中&#xff0c;不仅影响家居环境的整洁度&#xff0c;还可能成为过敏的源头。因此&#xff0c;如何高效地处理这些猫浮…...

苏州大厂面试题JAVA 面试集

基础知识1、强引用、软引用、弱引用、幻象引用有什么区别?(java基础) 答案参考:https://time.geekbang.org/column/article/6970 2、 对比Hashtable、HashMap、TreeMap有什么不同?(数据结构) 答案参考:https://time.geekbang.org/column/article/8053 3、一个线程调用两次…...

数据库取出来的日期格式是数组格式,序列化日期格式

序列化前&#xff0c;如图所示&#xff1a; 解决方式&#xff0c;序列化日期&#xff08;localdatetime&#xff09;格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…...

【Android】创建一个可以在屏幕上拖动的悬浮窗

项目需求 在界面上创建一个悬浮窗&#xff0c;可以自由的移动这个悬浮窗 需求解决 1.添加权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>2.请求权限 从 Android 6.0 (API 23) 开始&#xff0c;应用需要动态请求显示悬浮窗…...

SPI NAND、SD NAND和eMMC对比—MK米客方德

目录 1. 容量: 2.封装类型&#xff1a; 3.速度: 4.性能: 5.寿命: 6. 使用方式: 7. 其他优缺点: 8.常见应用场景: 1. 容量: SPI NAND通常提供从几百MB到几GB的存储容量。 SD NAND的容量覆盖范围比SPI NAND更广&#xff0c;从几GB到几十GB不等。 eMMC的容量范围更大&a…...

“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“

目录 YUM 仓库安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; RPM 包安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 源码编译安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 三者区别 YUM 仓库安装 概念&#xff1a; YUM&…...

中电金信:银行业私有云何去何从

2009年&#xff0c;云计算开始从概念走向实践。在这一年&#xff0c;Gartner在预测2010十大发展趋势中&#xff0c;将云计算列在榜首。在这之后&#xff0c;谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代&#xff0c;这一年也被定为“云元…...

Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。

Windows系统&#xff1a;Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档&#xff08;需要重启&#xff09;的对勾&#xff0c;点击确定&#xff0c;彻底关闭后重启&#xff0c;这样打开的每一个PDF文件对应的是一个窗口&#xff0c;并…...

从0开始学习pyspark--pyspark的数据读取[第4节]

在PySpark中&#xff0c;读取文件型数据是一个常见的操作&#xff0c;Spark支持多种数据格式&#xff0c;如CSV、JSON、Parquet、Avro等。以下是一些常用的方法来读取不同格式的文件数据。 读取文本型数据 读取CSV文件: 使用spark.read.csv方法读取CSV文件&#xff0c;可以通…...

极速升级:MacOS系统中Pip源的切换指南

极速升级&#xff1a;MacOS系统中Pip源的切换指南 在MacOS系统中&#xff0c;Python的包管理工具Pip是我们管理和安装Python库的得力助手。然而&#xff0c;默认的Pip源在国外&#xff0c;对于国内用户来说&#xff0c;访问速度可能较慢。因此&#xff0c;更换Pip源以提高下载…...

服务器的分类,主流服务器的应用场景

一、服务器分类 服务器可以按应用层次、体系架构、用途、外形等进行分类。以下是详细说明&#xff1a; 按应用层次分类 入门级服务器&#xff1a;这些服务器一般用于小型企业或部门的简单任务&#xff0c;如文件共享和打印服务。工作组级服务器&#xff1a;适用于中小型企业&…...

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes (使用类) Ref…...

从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路

在当今日新月异的科技浪潮中&#xff0c;安防监控领域的技术发展日新月异&#xff0c;全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力&#xff0c;为各行各业提供了前所未有的安全保障&#xff0c;成为现代安防体系中的重要组成部分。 一、全景摄像机的技…...

Java学习 -Golang开发环境+目录结构+编译+部署

开发环境 环境变量设置 GOROOT 指定 golang sdk 的安装目录GOPATH golang 工作目录&#xff0c;项目的源码放在这个目录下PATH 将 GOROOT/bin 放在 Path 路径下&#xff0c;方便命令行能直接运行 golang的命令行工具项目目录结构 |--project // 位于G…...

Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)

一、缓存 缓存是计算机中一个很经典的概念&#xff0c;核心思路是把一些常用的数据放到访问速度更快的地方&#xff0c;方便随时读取&#xff1b; 但对于计算机硬件来说&#xff0c;往往访问速度越快的设备&#xff0c;成本越高&#xff0c;存储空间越小&#xff0c;缓存是更…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...