FilterInvocationSecurityMetadataSource 接口是 Spring Security 中的核心接口之一,用于获取指定请求所需的访问控制元数据,包括访问所需的权限、角色等信息。该接口定义了如下方法:
- Collection getAttributes(Object object):根据传入的请求对象,获取该请求所需的访问控制元数据,返回一个 ConfigAttribute 对象的集合。
- Collection getAllConfigAttributes():获取系统中所有已定义的访问控制元数据,返回一个 ConfigAttribute 对象的集合。
- boolean supports(Class<?> clazz):判断该类是否支持传入的参数类型,如果支持则返回 true,否则返回 false。 FilterInvocationSecurityMetadataSource 接口的实现类负责根据请求 URL ,从数据库或其他外部数据源中获取相应的访问控制元数据,并将其放置到 Spring Security 的全局缓存中供后续使用。常见的实现类包括:
- AntPathRequestMatcher:基于 Ant 风格的 URL 匹配器,用于匹配请求的 URL。
- DefaultFilterInvocationSecurityMetadataSource:默认的 FilterInvocationSecurityMetadataSource 实现类,用于获取访问控制元数据。
- ExpressionBasedFilterInvocationSecurityMetadataSource:基于表达式的 FilterInvocationSecurityMetadataSource 实现类,用于动态获取访问控制元数据。 使用 FilterInvocationSecurityMetadataSource 接口时,我们需要将其注入到 FilterSecurityInterceptor 中,如下所示:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private FilterInvocationSecurityMetadataSource securityMetadataSource; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() { public <O extends FilterSecurityInterceptor> O postProcess(O fsi) { fsi.setSecurityMetadataSource(securityMetadataSource); return fsi; } }); } // ...省略其他配置... }
在上面的代码中,我们将 FilterInvocationSecurityMetadataSource 的实现类 securityMetadataSource 注入到 configure() 方法中,并使用 setObjectPostProcessor() 方法将其注册到 FilterSecurityInterceptor 中。这样,当用户发起请求时,Spring Security 将从 securityMetadataSource 中获取该请求所需的访问控制元数据,并根据这些元数据进行访问控制。 总结来说,FilterInvocationSecurityMetadataSource 接口用于获取指定请求所需的访问控制元数据,实现类负责根据请求 URL,从数据库或其他外部数据源中获取相应的访问控制元数据,并将其放置到 Spring Security 的全局缓存中供后续使用。同时,我们需要将其注入到 FilterSecurityInterceptor 中,并使用 setObjectPostProcessor() 方法将其注册到 FilterSecurityInterceptor 中,以实现访问控制功能。