引入的自动配置类全部在:org.springframework.boot.autoconfigure.security.servlet 下
UserDetailsServiceAutoConfiguration
:前提是自己没有引入用户配置相关类
InMemoryUserDetailsManager
SecurityAutoConfiguration
SpringBootWebSecurityConfiguration
SecurityAutoConfiguration
创建,在 ManagementWebSecurityAutoConfiguration
中创建 SecurityFilterChainWebSecurityConfiguration
创建 SecurityExpressionHandler
用来处理权限表达式
创建 WebSecurity
webSecurityConfigurers
创建 Filter(FilterChainProxy): springSecurityFilterChain()
走到 AbstractConfiguredSecurityBuilder
的状态机,主要执行 performBuild() 方法,该方法由 WebSecurity 来实现
会先将全局配置的忽略请求放到整个 SecurityFilterChain 的最前面
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring()
.requestMatchers("/home/**"); // 忽略静态资源
}
最终整合所有的 SecurityFilterChain,构建成 FilterChainProxy
主要就是通过 WebSecurityConfiguration 获取用户自己创建的:
@Autowired(required = false)
void setFilterChains(List<SecurityFilterChain> securityFilterChains) {
this.securityFilterChains = securityFilterChains;
}
@Autowired(required = false)
void setWebSecurityCustomizers(List<WebSecurityCustomizer> webSecurityCustomizers) {
this.webSecurityCustomizers = webSecurityCustomizers;
}
SpringWebMvcImportSelector
:看当前是不是 Servlet 环境,如果是的话,引入WebMvcSecurityConfiguration
否则 do nothing
主要作用是将 Spring MVC 与 Spring Security 整合,带来一些额外的功能
比较有用的地方是Controller参数解析器,可以使用注解获取当前用户或者 SecurityContext
@GetMapping("/me")
public ResponseEntity<String> getCurrentUser(@AuthenticationPrincipal UserDetails userDetails)
如果引入了 OAuth2 相关依赖,那么 *OAuth2ImportSelector
会发生作用(此处暂时全部为 false 先跳过)*
*HttpSecurityConfiguration
比较重要,作用就是暴露出关键的 HttpSecurity*