也是比较核心的过滤器

时间:2021-12-13 09:14:38

引言: 本文系《认证鉴权与API权限控制在微处事架构中的设计与实现》系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完。本文对照长,对这个系列进行收尾,主要内容包孕对授权和鉴权流程之外的endpoint以及Spring Security过滤器部分踩坑的经历。欢迎阅读本系列文章。

1. 前文回顾

首先还是按例对前文进行回顾。在第一篇 认证鉴权与API权限控制在微处事架构中的设计与实现(一)介绍了该项目的配景以及技术调研与最后选型。第二篇认证鉴权与API权限控制在微处事架构中的设计与实现(二)画出了简要的登录和校验的流程图,并重点讲解了用户身份的认证与token发放的具体实现。第三篇认证鉴权与API权限控制在微处事架构中的设计与实现(三)先介绍了资源处事器配置,以及此中涉及的配置类,后面重点讲解了token以及API级另外鉴权。

本文将会讲解残剩的两个内置端点:注销和刷新token。注销token端点的措置惩罚惩罚与Spring Security默认供给的有些’/logout’有些区别,不只清空SpringSecurityContextHolder中的信息,还要增加对存储token的清空。另一个刷新token端点其实和之前的请求授权是一样的API,只是参数中的grant_type不一样。

除了以上两个内置端点,后面将会重点讲下几种Spring Security过滤器。API级另外操纵权限校验原来设想是通过Spring Security的过滤器实现,特地把这边学习了一遍,踩了一遍坑。

最后是本系列的总结,并对付存在的不敷和后续事情进行阐述。

2. 其他端点 2.1 注销端点

在第一篇中提到了Auth系统内置的注销端点 /logout,如果还记得第三篇资源处事器的配置,,下面的关于/logout配置必然不陌生。

1 //... 2 .and().logout() 3 .logoutUrl("/logout") 4 .clearAuthentication(true) 5 .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()) 6 .addLogoutHandler(customLogoutHandler());

上面配置的主要感化是:

设置注销的URL

清空Authentication信息

设置注销告成的措置惩罚惩罚方法

设置自界说的注销措置惩罚惩罚方法

固然在LogoutConfigurer中还有更多的设置选项,笔者此处列出项目所需要的配置项。这些配置项围绕着LogoutFilter过滤器。顺带讲一下Spring Security的过滤器。其使用了springSecurityFillterChian作为了安适过滤的入口,各类过滤器按挨次具体如下:

SecurityContextPersistenceFilter:与SecurityContext安适上下文信息有关

HeaderWriterFilter:给http响应添加一些Header

CsrfFilter:防备csrf打击,默认开启

LogoutFilter:措置惩罚惩罚注销的过滤器

UsernamePasswordAuthenticationFilter:表单认证过滤器

RequestCacheAwareFilter:缓存request请求

SecurityContextHolderAwareRequestFilter:此过滤器对ServletRequest进行了一次包装,使得request具有越发丰富的API

AnonymousAuthenticationFilter:匿名身份过滤器

SessionManagementFilter:session相关的过滤器,常用来防备session-fixation protection attack,以及限制同一用户开启多个会话的数量

ExceptionTranslationFilter:异常措置惩罚惩罚过滤器

FilterSecurityInterceptor:web应用安适的关键Filter

各类过滤器简单标注了感化,不才一节重点讲此中的几个过滤器。注销过滤器排在靠前的位置,我们一起看下LogoutFilter的UML类图。

也是比较核心的过滤器

类图和我们之前配置时的思路是一致的,HttpSecurity创建了LogoutConfigurer,我们在这边配置了LogoutConfigurer的一些属性。同时LogoutConfigurer按照这些属性创建了LogoutFilter。

LogoutConfigurer的配置,第一和第二点就不用再详细解释了,一个是设置端点,另一个是清空认证信息。
对付第三点,配置注销告成的措置惩罚惩罚方法。由于项目是前后端疏散,客户端只需要知道执行告成该API接口的状态,并不用返回具体的页面或者继续向下通报请求。因此,这边配置了默认的HttpStatusReturningLogoutSuccessHandler,告成直接返回状态码200。
对付第四点配置,自界说注销措置惩罚惩罚的要领。这边需要借助TokenStore,对token进行操纵。TokenStore在之前文章的配置中已经讲过,使用的是JdbcTokenStore。首先校验请求的合法性,如果合法例对其进行操纵,先后移除refreshToken和existingAccessToken。

1 public class CustomLogoutHandler implements LogoutHandler { 2 //... 3 @Override 4 public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { 5 //确定注入了tokenStore 6 Assert.notNull(tokenStore, "tokenStore must be set"); 7 //获取头部的认证信息 8 String token = request.getHeader("Authorization"); 9 Assert.hasText(token, "token must be set"); 10 //校验token是否切合JwtBearer格局 11 if (isJwtBearerToken(token)) { 12 token = token.substring(6); 13 OAuth2AccessToken existingAccessToken = tokenStore.readAccessToken(token); 14 OAuth2RefreshToken refreshToken; 15 if (existingAccessToken != null) { 16 if (existingAccessToken.getRefreshToken() != null) { 17 LOGGER.info("remove refreshToken!", existingAccessToken.getRefreshToken()); 18 refreshToken = existingAccessToken.getRefreshToken(); 19 tokenStore.removeRefreshToken(refreshToken); 20 } 21 LOGGER.info("remove existingAccessToken!", existingAccessToken); 22 tokenStore.removeAccessToken(existingAccessToken); 23 } 24 return; 25 } else { 26 throw new BadClientCredentialsException(); 27 } 28 } 29 //... 30 }

执行如下请求:

method: get url: http://localhost:9000/logout header: { Authorization: Basic ZnJvbnRlbmQ6ZnJvbnRlbmQ= }

注销告成则会返回200,将token和SecurityContextHolder进行清空。

2.2 刷新端点