Spring Security(maven项目) 3.0.2.4版本

前言:

通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度

温故知新:

正片:

第四篇:认识SpringSecurity认证框架(下)
第五篇:

第四篇:认识SpringSecurity认证框架(下)

标题为Access Currently Authenticated User——访问当前已验证的用户

在上一期,我们体验官方的Security认证模型(框架),如何定义的

在这一期,我们将体验SecurityContextHolder承担完登录,认证后的内容

逻辑推演:

认证完后的内容,存储在SecurityContextHolder内的SecurityContext中的Authentication中

那么,我们要读出存储在Authenticaiton的内容该怎么办?

第一:获取SecurityContext内容

第二:获取Authentication的内容

第三:获取详细信息

发现没,这就是创建的倒用,对比一下

第一:通过SecurityContextHolder创建EMptyContext内容

第二:创建Authenticaiton详细认证内容

第三:将Authentication设置为Context内容

第四:将Context内容设置为SecurityContextHolder内容

其中第三与第四可以合成一步,但是在官方文档中是不建议这么做的,因为会导致线程竞争

看到官方的示例

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

第一步:获取SecurityContext ✔

第二步:获取Authentication ✔

第三步:针对需要的内容去获取剩下的三部分 ✔

对比自定义Context


SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication =new TestingAuthenticationToken("username", "password", "ROLE_USER");
context.setAuthentication(authentication);SecurityContextHolder.setContext(context);

第一步:创建EmptyContext

第二步:创建Authentication

第三步:设置ContextHolder

在对比中,我们可以发现,Authenticaiton认证是基于SecurityContext的,而SecurityContext是基于SecurityContextHolder

也是十分符合认证框架图,SecurityContextHolder在最底层,Authentication在最顶层,在这一期,我们将体验SecurityContextHolder在完成一个完整的认证循环后的内容

这么大费周章的去描述这个内容,为了更好看懂下面这个BUG

在运行这段代码时,我们碰见了Security第一个报错

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.springframework.security.core.Authentication.getName()" because "authentication" is null

线程 “main” java.lang.NullPointerException 中出现异常:无法调用 “org.springframework.security.core.Authentication.getName()”,因为 “authentication” 为 null

为什么会导致该内容为空的?

因为SecurityContextHolder没接受到认证用户信息,导致Context为空,最终导致Authentication为空!

知道了为什么报错,就知道怎么解决

这里作者想到了三种

第一种:SecurityContextHolder成功接受内容

第二种:自定义一个登录认证代码,完成SecurityContextHolder

这两种方法都离不开SecurityCOntextHolder,因为没有Holder就没有Context,懂不懂Security authentication认证地基含金量!

实践

第一种:让SecurityContextHolder成功接受内容

        答案:因为报错,无法运行客户端,导致无法接受信息,死局!

第二种:自定义一个登入认证代码

        答案:由于作者水平,导致无法实践

那这个就不能管了吗?有一句话说的好,发现问题是代码你有能力,解决问题靠的是态度,而不是技术!

我就在第一种方法上,修改了,既然没办法直接调用,因为Holder必为空,也就是死局,那我能不能让他先登录,再去调用呢?

结合上MVC框架,哦,懂了,我们可以将这段内容编写成一个接口,先完成登录功能,再去调用接口,接口再去完成Holder → context →Authentication的循环,返回Context

理论可行,实践开始

实践结果

打印出来了,和创建时的差不多

差不多,代表了,代码也差不多

废话,打印的都是基于Authenticaion的,能差不多吗!!!!!!!

疑问,既然能打印出单独的属性,那么我直接打印context可以吗?

实践开始

内容SecurityContextImpl [Authentication=UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=user, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, CredentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=127.0.0.1, SessionId=1D1D1BFC6CA26B03307193822580EAAD], Granted Authorities=[]]]

Contest里面包含很多内容

既然可以打印这个,不妨试试Authentication的全部GEt方法的内容

我们打印了Authentication的区别内容+Context

发现没,这个用户名和密码是不属于用户明细的

代码运行完了,下面的说明没啥好看的,总结下来就两个字,勿动,六个字,勿动默认配置

总结:第四篇上下

第一:Security认证架构(专业点,模板阿,框架阿,都差不多)一切基于SecurityContextHolder,Authentication基于Context

第二:解决问题靠的是态度,而不是能力

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

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

相关文章

stm32 移植RTL8201F(正点原子例程为例)

最近在工作中需要使用RTL8201F&#xff0c;在网上找了很多帖子&#xff0c;没有找到合适的&#xff0c;自己翻资料移植了一个。 模板工程使用的是正点原子的f407探索版的例程&#xff0c;原子使用的是LAN8720,需要把他的驱动修改成为我们自己用的RTL8201F。 1.将PHY_TYPE改成我…

Unity学习笔记(四)如何实现角色攻击、组合攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 实现动画 首先实现角色移动的动画&#xff0c;动画的实现过程在第二篇&#xff0c;这里仅展示效果 attack1 触发攻击动画 实现脚本 接下来我们通过 Animator 编辑动画之间的过渡&#…

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 &#xff08;1&#xff09;概述 主从模式&#xff1a;这是redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从服务器&#xff…

一套比较简单的仓储系统

自己编写的一套比较简单的仓储系统&#xff0c;多仓库&#xff0c;入库、出库、明细、统计等相关功能 基于偌依的单体架构&#xff1a;springbootvueuniapp 后端&#xff1a;https://download.csdn.net/download/qq_30641447/90214834 前端&#xff1a;https://download.csdn…

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心思想在于通过复制现有的对象&#xff08;原型&#xff09;来创建新的对象&#xff0c;而非通过传统的构造函数或类实例化方式。这种方式在需要快速创建大量相似对象时尤为高效&#x…

MySQL(二)MySQL DDL数据库定义语言

1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码&#xff0c;即可进入mysq1)1.1.1. 数据库操作 &#xff08;1&#xff09;查看数据库 mysql>show databases;注:MySQL语句分隔符为“&#xff1b;”   mysql库很重要它里面有…

前端页面上传文件:解决 ERR_UPLOAD_FILE_CHANGED

文章目录 引言I 问题 ERR_UPLOAD_FILE_CHANGED问题重现步骤原因II 解决方法将文件转换为base64再转回file检测文件内容是否发生变更III 知识扩展发送一个包含文件和文本的multipart/form-data请求签名优化引言 文件上传应用场景:船舶设备的新增导入(基础信息:出厂编号)船舶…

学术写作中的各种流程图如何利用Kimi进行辅助构建?

目录 1.学术论文中的流程图 2.一些小实践 3.论文中严谨的实践流程 近期小编在思考使用AI工具制作流程图和思维导图&#xff0c;结果发现Kimi现在支持流程图了&#xff0c;Kimi在学术写作中的应用变得更加广泛和深入。随着AIGC技术的不断进步&#xff0c;Kimi的功能将更加强大…

竞品分析对于ASO优化的重要性

产品要想在拥有上千万款App的App Store中脱颖而出的话&#xff0c;要有绝对优势和运营方案&#xff0c;才有可能获得用户的关注。我们要分析和自身产品相似的功能&#xff0c;了解用户获取的途径等&#xff0c;从中获取对竞品有利的因素&#xff0c;明确自身产品的增加和优化方…

什么是485专用屏蔽线

文章目录 一,485屏蔽线基本概念二,485屏蔽线结构及工作原理1、结构2、工作原理三,485屏蔽线的应用一,485屏蔽线基本概念 485屏蔽线,顾名思义,是一种应用于RS-485通信系统的屏蔽线缆。RS_485是一种常用的有线通信协议,具有长距离、高速率、低成本等优点,广泛应用于工业自…

JavaScript BOMDOM

BOM window、document、location、navigator 和 screen等&#xff0c;把它们统称为BOM&#xff08;Browser Object Model&#xff0c;浏览器对象模型&#xff09; window对象 window对象位于BOM的顶层。由浏览器创建&#xff0c;也对应JavaScript本地对象Global &#xff1…

nginx高可用集群搭建

本文介绍nginx高可用集群的搭建。利用keepalived实时检查nginx进程是否存活、keepalived的虚拟ip技术&#xff0c;达到故障转移的目的。终端用户通过访问虚拟ip&#xff0c;感知不到实际发生的故障。架构图如下&#xff1a; 0、环境 Ubuntu&#xff1a;22.04.2 ltsnginx: 1.…

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…

python爬虫--小白篇【selenium自动爬取文件】

一、问题描述 在学习或工作中需要爬取文件资源时&#xff0c;由于文件数量太多&#xff0c;手动单个下载文件效率低&#xff0c;操作麻烦&#xff0c;采用selenium框架自动爬取文件数据是不二选择。如需要爬取下面网站中包含的全部pdf文件&#xff0c;并将其转为Markdown格式。…

Edge Scdn的应用场景有哪些?

酷盾安全Edge Scdn 具备强大的安全防护能力&#xff0c;通过多层防御机制&#xff0c;如防火墙、DDoS 攻击防护、入侵检测和防御、数据加密等&#xff0c;有效抵御各种网络攻击&#xff0c;包括 DDoS 攻击、CC 攻击、SQL 注入攻击、XSS 跨站脚本攻击等&#xff0c;保障网站和应…

TCPDump参数详解及示例

TCPDump参数详解及示例 TCPDump参数详解TCPDump -G的示例TCPDump -i any -s 2048 -G 600 -p udp -Z root -n -X -tt -w %Y_%m%d_%H%M_%S.pcap &的含义TCPDump是一款强大的网络数据包截获分析工具,可以将网络中传送的数据包的完全截获下来提供分析。它支持针对网络层、协议…

Vue2: table加载树形数据的踩坑记录

table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…