SpringSecurity SecurityContext 生命周期

记一次关于 SpringSecurity SecurityContext生命周期的理解

众所周知 SpringSecurity 将用户认证成功后的信息存放在 SecurityContext中,通过SecurityContextHolder.getContext() 可以在任何地方获得SecurityContext从而获得用户信息,SecurityContext 存在一个请求线程中及 ThreadLocal ,当请求结束后线程关闭SecurityContext 随之消失及在下次请求中无法获得上次请求的用户信息

附源码:

final class ThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {

	private static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<>();

	@Override
	public void clearContext() {
		contextHolder.remove();
	}

	@Override
	public SecurityContext getContext() {
		SecurityContext ctx = contextHolder.get();
		if (ctx == null) {
			ctx = createEmptyContext();
			contextHolder.set(ctx);
		}
		return ctx;
	}

	@Override
	public void setContext(SecurityContext context) {
		Assert.notNull(context, "Only non-null SecurityContext instances are permitted");
		contextHolder.set(context);
	}

	@Override
	public SecurityContext createEmptyContext() {
		return new SecurityContextImpl();
	}

}

然而在最近的使用中发现,当第一次请求结束后,发起新的请求,仍然可以获得上次请求保存的用户信息。此时就有点疑惑。
于是猜想SecurityContext的存储是否和Session有关,经验证确实如此,请求结束后SecurityContext 会放入 Session ,当下次访问时 SecurityContext 又会被取出放入重新放入SecurityContextHolder中。

验证思路:请求会根据Cookie查询Session,于是在新的新请求中删除Cookie 发现之前请求的SecurityContext 就无法被获取到了。

查阅文档后,确实如此.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值