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

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.kler.cn/a/470798.html

相关文章:

  • 并行云使用流程
  • 重温设计模式--13、策略模式
  • 概率基本概念 --- 离散型随机变量实例
  • uniapp 微信小程序 自定义日历组件
  • 计算机网络 (22)网际协议IP
  • Python连接和操作Elasticsearch详细指南
  • 期末速成C++【大题汇总完】
  • 【工具推荐】XSS 扫描器-XSStrike
  • 基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
  • 进行电商系统的开发
  • 使用 Nginx 轻松处理跨域请求(CORS)
  • 在vue3中根据需要展示特定国家的国旗
  • Postman + Jenkins + Report 集成测试
  • 在 ASP.NET CORE 中上传、下载文件
  • train_args = TrainingArguments()里面的全部参数使用
  • 中电金信携手华为发布“全链路实时营销解决方案”,重塑金融营销数智新生态
  • 设计模式-结构型-适配器模式
  • flutter 专题二十四 Flutter性能优化在携程酒店的实践
  • 计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
  • AI巡检系统在安全生产管理中的创新应用
  • 游戏引擎学习第74天
  • Redis 数据库源码分析
  • Opencv实现Sobel算子、Scharr算子、Laplacian算子、Canny检测图像边缘
  • stm32 移植RTL8201F(正点原子例程为例)
  • Easyexcel-4.0.3读取文件内容时遇到“java.lang.ClassNotFoundException”
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(二)-递归实现组合型枚举、带分数问题