pig4cloud中RequestMatcher的添加
环境
SpringBoot版本:2.7.14
SpringSecurity版本:5.7.10
pig4cloud版本:3.7.1-JDK8
概述
执行完SpringSecurity默认的Configuration之后,会执行自定义的Configuration,这里因为upms没有别的自定义配置;所以它只有依赖的pig-common/pig-common-security的配置:PigResourceServerConfiguration;执行到这个Configuration之前,已经加载了SpringSecurity的默认配置,然后在PigResourceServerConfiguration中会禁用一些Configuration;也会重新添加OAuth2ResourceServerConfigurer;在OAuth2ResourceServerConfigurer中会构建RequestMatcher
启动时添加RequestMatcher(以upms模块为例)
1. 执行到PigResourceServerConfiguration
执行到PigResourceServerConfiguration时,已经执行了SpringSecurity默认的Configuration了(默认的怎么执行可以看:这个文档),所以可以看到http对象中已经有了10个configure和1个filter;
2. 添加一个AntMatcher
可以看到添加了一个AntMatcher,将所有要放行的url(之前配置文件application.yml有配过的security.oauth2.ignore中的和默认放行的)
PermitAllUrlProperties中的部分代码截图:
关于AntMatcher可以看:这个文档 |
可以看到通过permitAll方法添加了一个带所有忽略的url的AntMatcher的ExpressionUrlAuthorizationConfigurer;
现在就变成了11个configure
3. 执行oauth2ResourceServer方法
然后执行oauth2ResourceServer方法,在这个方法中会添加请求头认证的token对象,请求头认证的entryPoint和token内省器;
最后会通过HttpSecurity的oauth2ResourceServer添加一个OAuth2ResourceServerConfigurer;现在就是12个configure
然后禁用了csrf,configure就变成了11个
4. 执行http.build
然后会走build流程,将这11个configure进行构建
从configures方法看,着重看ExpressionUrlAuthorizationConfigurer和OAuth2ResourceServerConfigurer;
4.1 ExpressionUrlAuthorizationConfigurer
这个方法主要是创建一个metadataSource,通过metadataSource创建FilterSecurityInterceptor对象,然后将其加入到http对象的filter中;
而metadataSource对象就是将之前拿到的ignore的url进行封装,做成RequestMatcher对象;
可以看到将所有ignore的url放到了最前面;如果匹配不到的花就要走any request;
然后通过createFilterSecurityInterceptor方法创建一个FilterSecurityInterceptor对象,这个对象会设置上之前的ignore url;
最后将处理好的FilterSecurityInterceptor放入HttpSecurity的对象http的filter中;
4.2 OAuth2ResourceServerConfigurer
这个configure的configure方法首先获取token内省器;然后取到里面的requestMatcher取出;设置给token内省器BearerTokenResolver;可以看到里面有个pathMatcher和一个urlProerties;
这些是在PigBearerTokenExtractor初始化的时候添加进去的
然后将其添加到requestMatcher(BearerTokenRequestMatcher)中;然后初始化AuthenticationManager对象;
看配置哪一个,有jwtConfigurer和opaqueTokenConfigurer;
然后通过AuthenticationManager来new一个BearerTokenAuthenticationFilter;然后通过setBearerTokenResolver方法设置放行的url的requestMatcher;最后将其添加到HttpSecurity的对象http中;
最后可以看到构造出来了13个filter,其中就有鉴权token的BearerTokenAuthenticationFilter和负责授权的FilterSecurityInterceptor;他们都已经有了匹配规则