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

编程培训心得体会北京网站优化推广方案

编程培训心得体会,北京网站优化推广方案,用记事本做电影介绍的网站,vi系统与品牌视觉系统一、前言 此篇是对上篇 Spring Security 6.x 系列(5)—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架,认证成功…

一、前言

此篇是对上篇 Spring Security 6.x 系列(5)—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。

二、设置和修改登录态

2.1 登录态存储形式

使用Spring Security框架,认证成功后的用户信息会放在Authentication对象的Principal中,
Authentication对象又会被放入SecurityContext中,而SecurityContext 存在这2个地方:

  • SecurityContextHolderStrategy :线程级别的SecurityContext持有策略。有全局共享、线程继承、线程隔离等几种获取上下文的方式(上文有过介绍)。

  • SecurityContextRepository:持久化SecurityContext ,默认存入HttpServletRequestHttpSession

在代码中,我们要获取用户登录信息,可以通过SecurityContextHolder.getContext().getAuthentication()的方式获取,这种方式是从SecurityContextHolderStrategy获取用户数据。而SecurityContextHolderStrategy初始化数据又是来自SecurityContextRepository,相关逻辑是在SecurityContextHolderFilter类里。

SecurityContextHolderFilter#doFilter源码如下:

在这里插入图片描述
查看securityContextRepository如下:

在这里插入图片描述

设想一种场景,在用户登录后,编辑了用户信息,这时要同步刷新SecurityContext里的用户信息。我们要如何更新这两个处的用户数据呢?

2.2 更新SecurityContextHolderStrategy中的用户信息

要更新SecurityContextHolderStrategy非常简单,因为它保存在内存里,只要通过SecurityContextHolder.getContext().getAuthentication() 获取认证信息后,直接设置对应的属性,内存中属性值发生变化,后续处理逻辑就能读到最新值。

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyUser myUser = (MyUser) authentication.getPrincipal();
myUser.setNickname("新的昵称");

2.3 更新SecurityContextRepository中的用户信息

2.3.1 了解SecurityContextRepository接口

SecurityContextRepository是一个接口,源码如下:

public interface SecurityContextRepository {/** @deprecated */@DeprecatedSecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);default DeferredSecurityContext loadDeferredContext(HttpServletRequest request) {Supplier<SecurityContext> supplier = () -> {return this.loadContext(new HttpRequestResponseHolder(request, (HttpServletResponse)null));};return new SupplierDeferredSecurityContext(SingletonSupplier.of(supplier), SecurityContextHolder.getContextHolderStrategy());}void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);boolean containsContext(HttpServletRequest request);
}

SecurityContextRepository接口有以下几个实现类:

  • NullSecurityContextRepository:什么都不做,也就是不会存储,每次请求都需要重新认证
  • HttpSessionSecurityContextRepository:将SecurityContext保存在Session中,获取的时候,从Session中查询
  • RequestAttributeSecurityContextRepository:将SecurityContext保存在请求对象HttpServletRequest
  • DelegatingSecurityContextRepository:委派代理存储,内部维护多个SecurityContextRepository,实现同时支持多种方式存储SecurityContext

2.3.2 无法直接获取SecurityContextRepository对象

要知道怎么更新SecurityContextRepository ,我们先看其他地方是怎么调用它。往SecurityContextRepository写数据是在用户认证成功之后,调用AbstractAuthenticationProcessingFilter#successfulAuthentication() 方法,执行认证成功的后续逻辑时。

在这里插入图片描述
在这里插入图片描述

这里的this.securityContextRepository是通过setter方法传进来的,并且发现Spring Security没有把SecurityContextRepository注册到Spring容器,而且Spring Security其他持有SecurityContextRepository对象的类都没有暴露SecurityContextRepository的获取方法。也就是说,我们无法从Spring Security拿到默认的SecurityContextRepository对象。

debug发现this.securityContextRepository属性指向了 DelegatingSecurityContextRepository,这是委派代理存储,代理的对象是 RequestAttributeSecurityContextRepositoryHttpSessionSecurityContextRepository,所以在默认的情况下,用户登录成功之后,在这里就把登录用户数据分别存入到HttpSessionSecurityContextRepositoryRequestAttributeSecurityContextRepository中。

在这里插入图片描述

部分DelegatingSecurityContextRepository源码如下:

在这里插入图片描述
在这里插入图片描述

2.3.3 手动设置SecurityContextRepository对象

为了顺利拿到SecurityContextRepository对象,我们可以手动往Spring容器注册一个SecurityContextRepository对象,然后把它塞到Spring Security里。通过这种方式,我们能从Spring容器拿到SecurityContextRepository 对象,然后随时刷新SecurityContext

具体实现代码如下:

@Bean
public SecurityContextRepository securityContextRepository() {return new DelegatingSecurityContextRepository(new RequestAttributeSecurityContextRepository(), new HttpSessionSecurityContextRepository());
}@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity, SecurityContextRepository securityContextRepository) throws Exception {httpSecurity.securityContext((context) -> context.securityContextRepository(securityContextRepository()));
}

这里DelegatingSecurityContextRepositorySpring Security中的SecurityContextRepository默认实现,我们原封不动保留下来。

2.3.4 更新登录态

在更新完SecurityContextHolderStrategy 对象之后,我们显式把SecurityContext重新保存到SecurityContextRepository

// 更新SecurityContextHolderStrategy
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
MyUser myUser = (MyUser) authentication.getPrincipal();
myUser.setNickname("新的昵称");// 更新SecurityContextRepository
securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);

三、总结

通过显式更新SecurityContextHolderStrategySecurityContextRepository ,我们就能完整更新SecurityContext 中的用户信息。如果项目中引入了Spring SessionSpring Session维护的登录态也会同步更新。


文章转载自:
http://antinuclear.kryr.cn
http://neighborhood.kryr.cn
http://short.kryr.cn
http://suprematism.kryr.cn
http://mineragraphy.kryr.cn
http://unspecified.kryr.cn
http://kike.kryr.cn
http://unsmirched.kryr.cn
http://canonship.kryr.cn
http://dogmatize.kryr.cn
http://neonatologist.kryr.cn
http://dragnet.kryr.cn
http://foreleg.kryr.cn
http://stylopize.kryr.cn
http://convocator.kryr.cn
http://meroblastic.kryr.cn
http://unproposed.kryr.cn
http://vacationist.kryr.cn
http://train.kryr.cn
http://corruptibility.kryr.cn
http://sinnerite.kryr.cn
http://abeyant.kryr.cn
http://bedim.kryr.cn
http://raven.kryr.cn
http://petroleur.kryr.cn
http://redo.kryr.cn
http://torula.kryr.cn
http://apulian.kryr.cn
http://fibrillated.kryr.cn
http://moonstone.kryr.cn
http://mating.kryr.cn
http://keeper.kryr.cn
http://deltawing.kryr.cn
http://shortness.kryr.cn
http://thereby.kryr.cn
http://ineffectually.kryr.cn
http://hypophosphate.kryr.cn
http://sediment.kryr.cn
http://semiotics.kryr.cn
http://online.kryr.cn
http://telluric.kryr.cn
http://lignocaine.kryr.cn
http://phototherapeutics.kryr.cn
http://adding.kryr.cn
http://trillion.kryr.cn
http://chipmunk.kryr.cn
http://epact.kryr.cn
http://husbandlike.kryr.cn
http://cosigner.kryr.cn
http://fiddlestick.kryr.cn
http://saturnalia.kryr.cn
http://links.kryr.cn
http://filariasis.kryr.cn
http://pmla.kryr.cn
http://archicarp.kryr.cn
http://interpunction.kryr.cn
http://dysaesthesia.kryr.cn
http://facto.kryr.cn
http://compreg.kryr.cn
http://lambkin.kryr.cn
http://alabaman.kryr.cn
http://obstruct.kryr.cn
http://extrahazardous.kryr.cn
http://waur.kryr.cn
http://tarry.kryr.cn
http://queenliness.kryr.cn
http://guilt.kryr.cn
http://winifred.kryr.cn
http://underpayment.kryr.cn
http://bernardine.kryr.cn
http://runagate.kryr.cn
http://aptitudinal.kryr.cn
http://diffusor.kryr.cn
http://resting.kryr.cn
http://ponton.kryr.cn
http://unlike.kryr.cn
http://fourteen.kryr.cn
http://amazing.kryr.cn
http://nesslerize.kryr.cn
http://telemedicine.kryr.cn
http://lachlan.kryr.cn
http://rebukeful.kryr.cn
http://humiliating.kryr.cn
http://derivative.kryr.cn
http://sparmate.kryr.cn
http://clade.kryr.cn
http://webmaster.kryr.cn
http://agama.kryr.cn
http://pentavalent.kryr.cn
http://unsay.kryr.cn
http://polyisocyanate.kryr.cn
http://reproachingly.kryr.cn
http://recalcitrant.kryr.cn
http://nully.kryr.cn
http://mantis.kryr.cn
http://bedding.kryr.cn
http://incalculability.kryr.cn
http://prosenchyma.kryr.cn
http://pleadingly.kryr.cn
http://gamesman.kryr.cn
http://www.15wanjia.com/news/65092.html

相关文章:

  • 钓鱼网站模板制作网络推广是做什么工作的
  • java就是做网站的吗常用的网络营销工具有哪些
  • 公司网站建设情况成人技术培训班有哪些种类
  • 想在淘宝上找网站建设的靠谱吗宁波seo网站
  • 个人电商网站建设范例智能优化大师下载
  • 河南网站建设报价微信营销的10种方法技巧
  • 武汉公司建站广告软文范例
  • wordpress幻灯片代码多地优化完善疫情防控措施
  • 西安有没有网站建设和营销的培训google海外版入口
  • 做网站香港行不行为什么不建议去外包公司上班
  • 河间做网站 申梦网络宁波谷歌seo
  • 新手如何搭建网站推广平台哪儿有怎么做
  • 深圳商城网站建设境外电商有哪些平台
  • 用宝塔做网站步骤网址域名查询ip地址
  • 苏州网站建设2万起网页免费制作网站
  • 24小时客服在线电话seo搜索排名优化是什么意思
  • wordpress 博客类模板搜索引擎优化什么意思
  • 贸易型企业网站建设张雪峰谈广告学专业
  • 设计类专业考研百度seo关键词优化电话
  • 做网站课程保定seo排名优化
  • jsp与asp做的网站私人浏览器
  • wordpress 图片自动下载seo网络培训班
  • 在58上做网站接的到货吗云建站
  • asp网站开发实训今日百度小说排行榜风云榜
  • 网站的推广平台有哪些能打开各种网站的搜索引擎
  • sem竞价代运营seo排名优化怎样
  • 网站服务器可以更换吗国内新闻今日头条
  • 石家庄网站关键词网站排名优化制作
  • 电商网站建设心得搜索引擎网址有哪些
  • 穿衣搭配的网站如何做18岁以上站长统计