现象
在项目集成springSecurity之后,第一登录之后,用户的请求都是直接访问的,用户的信息在后台都是可以通过SecurityContext获取。
推测
在第一次登录成功之后,会将用户信息存储到session中,用户之后的请求,会通过sessionID查询session,然后通过sessionId获取session对象,然后从session对象中获取SecurityContext数据,然后将数据放入SecurityContextHolder中。后面就可以直接获取到对应的用户数据。
具体实现
第一次登录成功
登录成功之后,在AbstractAuthenticationProcessingFilter
中的successfulAuthentication方法。调用SecurityContextHolder.getContext()的setAuthentication方法,会将我们验证成功的那个Authentication放到SecurityContext中,然后再放到SecurityContextHolder中。然后还会调用我们自定义的successHandle。
在请求处理完回来之后,过滤链依次返回,知道退回到第一个过滤器SecurityContextPersisenceFilter中,
finally{
//1、查询上下文中是否包含认证信息
//2、有的话,放入session中
repo.saveContent(...);
}
第二次请求
首先被过滤链的第一个过滤器SecurityContextPersisenceFilter拦截,在代码块中
//1、首先获取session中SecurityContext
SecurityContext contextBeforeChainExecution = repo.loadcontext(...);
//2、将Context放入SecurityHolder中
SecurityHolder.setContext(contextBeforeChainExecution );
//3、继续下一个过滤器
chain.doFilter(...);
通过第一次过滤器,上下文中就会包含用户认证的信息。
参考
DefaultSecurityFilterChain查看所有的Filter器,也会在日志中打印
博客地址