SpringSecurity5 Oauth2.0 Login核心过滤器备忘录
SecurityContextPersistenceFilter(安全上下文持久化)
默认到Session里面搂数据,搂到数据再塞入SecurityContextHolder,
此时SecurityContextHolder里面有数据,再调用filterchain内部的其他filter,其他filter也会处理这个SecurityContextHolder
数据存入SecurityContextHolder是一次性的,本次请求结束SecurityContextHolder里面的数据就会丢失,
所以本filter在filterchain执行结束之后,会从SecurityContextHolder对应的threadLocal里面取出context,存入httpsession,同时清空threadLocal(防内存泄漏)
httpsession默认是会持久化(有超时时间),所以只要浏览器cookie里面有jsessionid,哪怕服务器重启,登陆状态也不会丢失
//doFilter方法
if (request.getAttribute(FILTER_APPLIED) != null) {
// ensure that filter is only applied once per request
chain.doFilter(request, response);
return;
}
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request,response);
//获取安全上下文
SecurityContext contextBeforeChainExecution = repo.loadContext(holder);
try {
SecurityContextHolder.setContext(contextBeforeChainExecution);
chain.doFilter(holder.getRequest(), holder.getResponse());
}
//过滤器链中的filter执行结束后,会过来清空
finally {
SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();
// Crucial removal of SecurityContextHolder contents - do this before anything else. 可能是怕内存泄漏(threadLocal实现)
SecurityContextHolder.clearContext();
repo.saveContext(contextAfterChainExecution, holder.getRequest(),holder.getResponse());//存到session中半持久化
request.removeAttribute(FILTER_APPLIED);
OAuth2AuthorizationRequestRedirectFilter(oauth2.0鉴权请求重定向filter)
将HttpServletRequest转换为OAuth2AuthorizationRequest(三方认证请求),且如果OAuth2AuthorizationRequest不等于null,则会重定向到第三方认证接
例如github,gitee的三方授权页面
OAuth2LoginAuthenticationFilter(oauth2.0 认证请求filter---oauth2.0 Login 流程的发动机)
oauth2.0 Login 流程的发动机,处理第三方认证的回调(该回调有授权码)
拿着授权码到第三方认证服务器获取access_token和refresh_token
拿着上一步获取到的access_token去第三方认证服务器获取用户信息
将获取到的用户信息通过OAuth2AuthorizedClientRepository.saveAuthorizedClient()方法保存在HttpSession(因为默认实现是基于HttpSession)
开发者应该可以自定义OAuth2AuthorizedClientRepository来实现自定义的用户信息存储,或者构造DefaultOAuth2AuthorizedClientManager(该manager内部持有OAuth2AuthorizedClientRepository)

浙公网安备 33010602011771号