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)

posted @ 2020-04-23 20:05  划过天空阿忠  阅读(1155)  评论(0)    收藏  举报