新版Spring Security6.2案例 - Basic HTTP Authentication

news2024/11/22 10:01:40

前言:

书接上文,翻译官网Authentication的Username/Password这页,接下来继续翻译basic的这页,因为官网说的都是原理性的,这边一个小案例关于basic http authentication。

Basic Authentication

本节介绍 HTTP 基本身份验证在 Spring Security 中的工作原理。首先,我们看到 WWW-Authenticate 标头被发送回未经身份验证的客户端

上图构建于SecurityFilterChain 图。

1.首先,用户向未授权的资源 /private 发出未经身份验证的请求。

2.Spring Security 的 AuthorizationFilter 通过抛出 AccessDeniedException 来指示未经身份验证的请求被拒绝。

3.由于用户未经过身份验证,因此 ExceptionTranslationFilter 将启动“启动身份验证”。配置的 AuthenticationEntryPoint 是 BasicAuthenticationEntryPoint 的实例,用于发送 WWW-Authenticate 标头。RequestCache 通常是不保存请求的 NullRequestCache,因为客户端能够重播它最初请求的请求。

当客户端收到 WWW-Authenticate 标头时,它知道它应该使用用户名和密码重试。下图显示了正在处理的用户名和密码的流程:

1.当用户提交其用户名和密码时,BasicAuthenticationFilter 会创建一个 UsernamePasswordAuthenticationToken,这是一种通过从 HttpServletRequest 中提取用户名和密码来进行的身份验证。

2.接下来,将 UsernamePasswordAuthenticationToken 传递到 AuthenticationManager 中进行身份验证。AuthenticationManager 外观的详细信息取决于用户信息的存储方式。

3.如果身份验证失败,则定义为“失败”,并做如下:

(1)SecurityContextHolder 被清除。

(2)调用 RememberMeServices.loginFail。如果未配置“记住我”,则为空操作。请参阅 Javadoc 中的 RememberMeServices 接口。

(3)调用 AuthenticationEntryPoint 以触发再次发送 WWW-Authenticate。请参阅 Javadoc 中的 AuthenticationEntryPoint 接口。

4.如果身份验证成功,则定义为“成功”,并做如下:

(1)Authentication身份验证信息则设置在 SecurityContextHolder 上。

(2)调用 RememberMeServices.loginSuccess。如果未配置“记住我”,则为空操作。请参阅 Javadoc 中的 RememberMeServices 接口。

(3)BasicAuthenticationFilter 调用 FilterChain.doFilter(request,response) 以继续执行应用程序逻辑的其余部分。请参阅 Javadoc 中的 BasicAuthenticationFilter 类

默认情况下,Spring Security 的 HTTP 基本身份验证支持处于启用状态。但是,一旦提供了任何基于 servlet 的配置,就必须显式提供 HTTP Basic。

以下示例显示了一个最小的显式配置:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
	http
		// ...
		.httpBasic(withDefaults());
	return http.build();
}

Basic Authentication例子

项目结构,很简单,maven里面也只有包含3.2spring boot,以及勾选web和security:

代码如下,先把默认表单登录注释掉:

@Configuration
@EnableWebSecurity
public class MySecurity {


    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
        http.authorizeHttpRequests((authorize) -> authorize
                .anyRequest().authenticated()
        )
                .httpBasic(Customizer.withDefaults());
//                .formLogin(Customizer.withDefaults());

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(userDetails);
    }

}
@RestController
public class Login {

    @GetMapping("/private")
    public String doLogin1() {

        return "private";
    }
}

访问localhost:8080/private

就会跳出需要身份验证的对话框,这个浏览器的行为,这是因为服务器的响应的报头里面,有返回

Www-Authenticate: Basic realm=“Realm”

在输入完争取用户名密码后,页面会有private,这是因为,在请求头里面有

Authorization: Basic dXNlcjpwYXNzd29yZA==

这个请求头的格式是把用户名密码进行base64编码,中间用冒号隔开,可以

​​

额外说明一点,这个是浏览器生成的访问凭据,一般来说,在浏览器关闭前会一直存在。凭据是保存在浏览器内部的,而不是用的 cookie,localstorage 等存储方式。所以从浏览器工具栏的应用那边删掉cookie方式无法奏效的,但是我试过在隐私设置里面,清除cookie是可以成功的。

参考文献: 

《Spring boot官网》

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

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

相关文章

C语言union联合体(共用体)

一、定义 联合体(共用体)是一种特殊的自定义的数据类型,它包含一系列的成员变量,这些成员变量共用一块内存空间。 语法: union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

电影推荐系统

基于springboot vue实现的电影推荐系统,通过Jsoup数据爬取。 效果图如下:

Java01 169-184

数组添加 import java.util.Scanner; public class ArrayAdd02 {public static void main(String[] args) {Scanner myScanner new Scanner(System.in);//数组一旦定义,不可以增加,必须增加新的数组int[] arr {1, 2, 3};do {int[] arrNew new int[arr…

2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题,包含G3锅炉水处理免费试题答案和解析及G3锅炉水处理模拟试题练习。安全生产模拟考试一点通结合国家G3锅炉水处理考试最新大纲及G3锅炉水处理考试真…

目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集 DOTA数据集包含2806张航空图像,尺寸大约从800x800到4000x4000不等,包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形(区别于传统的对边平行bbox)。类别分别为:plane, ship, s…

20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式,该模式将当前对象的内部状态保存到备忘录中,以便在需要时能将该对象的状态恢复到原先保存的状态。 备忘录模式提供了一种保存和恢复状态的机制,常用于快照的记录和状态的存储,在系统发生故障或数据发生…

为什么QLC NAND才是ZNS SSD最大的赢家?-part2

ZNS出现的背景是什么?ZNS SSD的原理是把namespace空间划分多个zone空间,zone空间内部执行顺序读写。 在ZNS的场景下,不同应用按照Zone配置信息,相应存放业务数据。由于是Host管理数据的摆放和存取位置,会最大程度减少G…

山海鲸可视化软件:选择合适的图表,让数据可视化更高效

作为一名山海鲸可视化软件的开发者,我深知选择合适的图表对于数据可视化的重要性。下面我将从开发者的角度,分享一些关于如何选择合适可视图表的建议。 首先,我们需要明确数据可视化的目标。不同的图表类型具有不同的特点和适用场景&#xff…

数据结构:并查集的原理和运用

文章目录 什么是并查集?并查集的模拟实现并查集的应用省份数量等式方程的可满足性 本篇总结的是并查集的使用方法和运用 什么是并查集? 给定这样一个场景,n个不同的元素划分成不同的,不相交的集合,在开始的时候&…

JavaEE之多线程编程:2.创建线程及Thread类常见方法(超全!!!)

一、创建线程 Java中创建线程的写法有很多种!!!这里介绍其中5种。 方法1:继承Thread类,重写run 创建一个类,让这个类继承自Thread父类,再重写我们的run方法就可以了。 使用Thread类&#xff…

文件批量管理方法:100个文件要怎样快速放在100个指定的文件夹中

处理大量文件时,经常要将多个文件放入相应的文件夹中。如果要处理的文件数量较大,例如100个文件要放入100个指定的文件夹中,那么如何快速有效地完成这个任务呢?下面看下云炫文件管理批量管理文件的方法,快速将100个文件…

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树 什么是二叉树? 二叉树是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。 与链表类似,二叉树的基本单元是节点,每…

jsonpath:使用Python处理JSON数据

使用Python处理JSON数据 25.1 JSON简介 25.1.1 什么是JSON JSON全称为JavaScript Object Notation,一般翻译为JS标记,是一种轻量级的数据交换格式。是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清…

强化学习--背景

背景 强化学习 背景方向马尔可夫决策过程动态规划 方向 从数据中学习,或者从演示中学习包含丰富的门类,例如以模仿学习为代表的来自专家的数据中学习策略、以强化逆学习,代表来自数据中学习奖励函数以及来自人类反馈中学习,为代表…

大数据机器学习与深度学习—— 生成对抗网络(GAN)

GAN概述 在讲GAN之前,先讲一个小趣事,你知道GAN是怎么被发明的吗?据Ian Goodfellow自己说: 之前他一直在研究生成模型,可能是一时兴起,有一天他在酒吧喝酒时,在酒吧里跟朋友讨论起生成模型。然…

使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

Python 从入门到精通 学习笔记 Day04

Python 从入门到精通 第四天 今日目标 数据类型-又见str、数据类型-又见list 列表切片&排序&反转&循环、字典 数据类型 - 又见str 字符串定义 字符串是一个有序的字符的集合,用于在计算机里存储和表示文本信息 创建 a "Hello ,my name is Ha…

鸿蒙开发框架(ArkUI)简单解析

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

Jetson Xavier NX开发环境配置——编译libusb-1.0.9

背景 新买的Jetson Xavier NX 8G微雪的开发板,刷机后虽然已经带了libusb的库,在命令窗口输入lsusb也能够找到usb设备。但是,光机的usb配置说明中提示最好把老版本的libusb卸载掉,安装libusb-1.0.9版本,因此&#xff0…

【语义分割数据集】——imagenet语义分割

地址:https://github.com/LUSSeg/ImageNet-S 1 例图 2. 类别和数量信息 疑问 根据原文的描述:Based on the ImageNet dataset, we propose the ImageNet-S dataset with 1.2 million training images and 50k high-quality semantic segmentation annot…