Spring Security是如何完成身份认证的?

1. 用户名和密码被过滤器获取到,封装成 Authentication ,通常情况下是 UsernamePasswordAuthenticationToken 这个实现类。

2. AuthenticationManager 身份管理器负责验证这个 Authentication

3. 认证成功后, AuthenticationManager 身份管理器返回一个被填充满了信息的(包括上面提到的 权限信息,身份信息,细节信息,但密码通常会被移除) Authentication 实例。

4. SecurityContextHolder 安全上下文容器将第3步填充了信息的 Authentication ,通过 SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中。

public class AuthenticationExample {
private static AuthenticationManager am = new SampleAuthenticationManager();
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
测试
while (true) {
System.out.println("Please enter your username:");
String name = in.readLine();
System.out.println("Please enter your password:");
String password = in.readLine();
try {
// 封装认证信息,未认证通过
Authentication request = new
UsernamePasswordAuthenticationToken(name, password);
// 认证逻辑
Authentication result = am.authenticate(request);
//当前线程绑定认证信息
SecurityContextHolder.getContext().setAuthentication(result);
break;
} catch (AuthenticationException e) {
System.out.println("Authentication failed: " + e.getMessage());
}
}
System.out.println("Successfully authenticated. Security context
contains: " +
SecurityContextHolder.getContext().getAuthentication());
}
}
class SampleAuthenticationManager implements AuthenticationManager {
static final List<GrantedAuthority> AUTHORITIES = new
ArrayList<GrantedAuthority>();
static {
AUTHORITIES.add(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public Authentication authenticate(Authentication auth) throws
AuthenticationException {
// 判断条件,用户名和密码是否相同
if (auth.getName().equals(auth.getCredentials())) {
// 封装认证信息,认证已通过
return new UsernamePasswordAuthenticationToken(auth.getName(),
auth.getCredentials(), AUTHORITIES);
}
throw new BadCredentialsException("Bad Credentials");
}
}
认证流程

推荐阅读

技术总体方案设计思路

如何评价代码的质量-CSDN博客

领域分解识别服务

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

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

相关文章

Python爬虫实战:研究xmltodict库相关技术

1. 引言 1.1 研究背景与意义 气象数据是环境研究、农业生产、城市规划等领域的重要基础。随着互联网技术的发展,越来越多的气象数据以 XML 格式在网络上公开。XML(可扩展标记语言)因其结构化和自描述性的特点,成为数据交换的标准格式之一。然而,这些数据通常分散在不同的…

中小企业无线局域网络搭建与优化指南

1. 引言&#xff1a;无线网络——驱动中国中小企业数字化转型的引擎 无线网络已成为现代企业运营的基础设施&#xff0c;直接影响员工工作效率和客户体验。随着Wi-Fi7技术的成熟和普及&#xff0c;中小企业网络建设正迎来全新机遇。在数字经济浪潮席卷全球的今天&#xff0c;无…

【已解决】python的kafka-python包连接kafka报认证失败

先说原因&#xff1a;安装python包的时候&#xff0c;多装了一个kafka的包&#xff1a;kafka 1.3.5 我把py文件打包成二进制文件&#xff0c;在linux上执行就一直报认证失败&#xff0c;后来确认登录信息、认证方式没有问题&#xff0c;把这个kafka包卸载…

传输层协议TCP(下)

上一篇https://blog.csdn.net/Small_entreprene/article/details/148193741?sharetypeblogdetail&sharerId148193741&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 接下来&#xff0c;我们来谈论TCP具体的机制&#xff01; 具体TCP机制 …

洛谷B3612 【深进1.例1】求区间和

题目描述 给定 n 个正整数组成的数列 a1​,a2​,⋯,an​ 和 m 个区间 [li​,ri​]&#xff0c;分别求这 m 个区间的区间和。 输入格式 第一行&#xff0c;为一个正整数 n 。 第二行&#xff0c;为 n 个正整数 a1​,a2​,⋯,an​ 第三行&#xff0c;为一个正整数 m 。 接下…

debian12 修改MariaDB数据库存储位置报错

debian12 修改MariaDB数据库存储位置到home报错 MariaDB 修改存储路径后启动失败问题解决 更改数据存储位置 如果需要将数据存储到其他位置&#xff08;如更大的分区&#xff09;&#xff1a; 停止 MariaDB 服务&#xff1a; bash sudo systemctl stop mariadb 创建新目录并设…

【评测】flux-dev文生图模型初体验

回到目录 【评测】flux-dev文生图模型初体验 1. 安装基础环境 参考 modelscope的Flux.1-dev页面 2. 使用tongyi写提示词 帮我用英文写3个&#xff0c;文生图片1024*1024的提示词&#xff0c;准备用flux.dev生成用 [pic03] 3. 运行代码 4090D满载运行&#xff0c; 1min左…

PHP7+MySQL5.6 雪里开简易预约制访客管理系统V1.0

# PHP7MySQL5.6 雪里开简易预约制访客管理系统 V1.0 ## 简介 本系统是一个基于PHP7和MySQL5.6的封闭校区访客管理系统&#xff0c;用于管理学生访客的申请、核销流程。 导入的账号预先提交访客信息(预约制)&#xff0c;无需审核&#xff0c;访客提交匿名制访客码给门卫登记放行…

【深度学习:进阶篇】--2.4.BN与神经网络调优

学习目标 目标 知道常用的一些神经网络超参数知道BN层的意义以及数学原理 应用 无 目录 学习目标 1.神经网络调优 1.1.调参技巧 1.2.运行 2.批标准化&#xff08;Batch Normalization&#xff09; 2.1.标准化公式 2.2.为什么可以优化简单 2.3.BN总结 1.神经网络调优 …

CMake指令: add_sub_directory以及工作流程

目录 1.简介 2.工作流程 3.示例场景 4.最佳实践 5.注意事项 6.总结 相关链接 1.简介 add_subdirectory 是 CMake 中用于添加子目录参与构建的命令&#xff0c;允许将项目拆分为多个模块或子项目&#xff0c;实现代码的模块化管理。 基本语法&#xff1a; add_subdirect…

【C++ 】智能指针:内存管理的 “自动导航仪”

目录 一、引入 二、智能指针的两大特性&#xff1a; 1、RAII 特点&#xff1a; 好处&#xff1a; 2、行为像指针 三、智能指针起初的缺陷&#xff1a;拷贝问题 四、几种智能指针的介绍。 1、C98出现的智能指针——auto_ptr auto_ptr解决上述拷贝构造的问题&#xff1a…

Java多线程实现之线程池详解

Java多线程实现之线程池详解 一、线程池的基本概念1.1 为什么需要线程池1.2 线程池的核心思想 二、Java线程池的实现2.1 Executor框架2.2 ThreadPoolExecutor构造参数 三、常见线程池类型3.1 FixedThreadPool3.2 CachedThreadPool3.3 SingleThreadExecutor3.4 ScheduledThreadP…

解码美元-黄金负相关:LSTM-Attention因果发现与黄金反弹推演

摘要&#xff1a;本文采用时间序列分析框架与自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;对黄金与美元指数的负相关关系进行量化拆解。通过构建包含宏观经济因子、市场情绪指标及地缘风险的三维分析模型&#xff0c;揭示当前贵金属市场的核心驱动逻辑&#xff0c…

Asp.Net Core SignalR导入数据

文章目录 前言一、安装包二、使用步骤1.实现SignalR Hub服务&#xff1a;2.实现CSV文件解析及数据导入服务3.控制器4.前端实现&#xff08;vue&#xff09; 三、关键技术点说明总结 前言 导入CSV文件中的数据到数据库&#xff0c;使用CsvHelper解析CSV文件&#xff0c;SqlBulk…

Modern C++(四)声明

4、声明 声明是将名字引入到cpp程序中&#xff0c;不是每条声明都声明实际的东西。定义是足以使该名字所标识的实体被使用的声明。声明包含以下几种&#xff1a; 函数定义模板声明模板显式实例化模板显式特化命名空间定义链接说明属性声明&#xff08;C11&#xff09;空声明&…

目标检测yolo算法

yolov5s&#xff1a; 从github官网下载yolov5的算法之后&#xff0c;配置好环境&#xff08;pycharm安装包-CSDN博客&#xff09;&#xff0c;再下载权重文件&#xff0c;比如默认的yolov5s.pt&#xff1b; 运行当前文件&#xff08;detect.py&#xff09;&#xff0c;就能看…

一个超强的推理增强大模型,开源了,本地部署

大家好&#xff0c;我是 Ai 学习的老章 前几天介绍了MOE 模型先驱 Mistral 开源的代码 Agent 大模型——mistralai/Devstral-Small-2505 今天一起看看 Mistral 最新开源的推理大模型——Magistral Magistral 简介 Mistral 公司推出了首个推理模型 Magistral 及自研可扩展强…

MySQL体系架构解析(五):读懂MySQL日志文件是优化与故障排查的关键

MySQL文件 日志文件 在服务器运行过程中&#xff0c;会产生各种各样的日志&#xff0c;比如常规的查询日志&#xff0c;错误日志、二进制日志、 redo 日志和 Undo 日志等&#xff0c;日志文件记录了影响 MySQL 数据库的各种类型活动。 常见的日志文件有&#xff1a;错误日志…

湖南省网络建设与运维赛项竞赛规程及样题

湖南省职业院校技能竞赛样题 赛题说明 一、竞赛内容 “网络建设与运维”竞赛共分三个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;职业规范与素养 &#xff08; 5 分&#xff09; 第二部分&#xff1a;网络搭建及安全部署项目 &#xff08; 50 分&#xff09…

华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio搭建AnythingLLM聊天助手

华为云FlexusDeepSeek征文 | 基于华为云ModelArts Studio搭建AnythingLLM聊天助手 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、AnythingLLM介绍AnythingLLM 简介AnythingLLM主要特点AnythingLLM地址 三、安装AnythingLLM应用下载…