目录
认证流程源码级详解
认证结果如何在多个请求之间共享
也就是分析security是如何将请求信息保持在session当中的
接着上一篇源码分析,讲到处理到了AbstractAuthenticationProcessingFilter类中,在认证成功的情况下,调用successfulAuthentication(request, response, chain, authResult);之后
调用SecurityContextHolder.getContext().setAuthentication(authResult); 保持认证后的请求信息。
由于是函数式编程,我们从左往右一步步来分析,查看getContext()方法
最后调用的是SecurityContext的setAuthentication(authResult)方法,因为它只是接口找到他的实现类
SecurityContextImpl类,可以看出来它只是简单的通过set get方法封装了authentication
稍作总结,整理一下上面的思绪:通过认证的请求保存到了SecurityContext,然后在外层是通过SecurityContextHolder调用它的静态方法获取到,这样通过的认证请求信息就可以供其他请求线程来访问了。SecurityContextHolder相当于ThreadLocal,保持线程需要共享的数据。
在security框架执行的过程中,首先和最后都需要经过的一个过滤器就是SecurityContextPersistenceFiter
当请求刚进来的时候,SecurityContextPersistenceFilter会首先检查session里面有没有SecurityContext,如果有就拿出来放入到线程里,如果是空的那就直接过去了,当响应的时候,如果线程里面有SecurityContext就把它们放入到session里面。
具体代码应用也挺简单的,为了不把篇幅拉太长,想一篇文章写完,所以想了解的自己在细细品读
获取认证用户信息
有上面的源码分析,我们就以及知道了,保存我们认证请求信息的是SecurityContext
可以直接获取,因为springmvc会帮我们注入进去的
如果只想要用户的输入信息,不需要其他信息