1、POM依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.2.0 RELEASE<version> </dependency>
2、 默认配置
添加依赖后,便可实现Spring Security的默认配置。
spring-boot-autoconfigurer项目下的WebSecurityEnablerConfiguration 自动加载Spring Security 默认配置[WebSecurityConfigurerAdapter]web
Spring Security 默认配置主要以下:spring
3、过滤器链
若是你是第一次使用Spring Security,必定会以为很cool!Spring Security是如何作到的。api
Spring Security主要基于过滤器(责任链模式)和AOP实现。session
过滤器的结构大体是这么个意思app
那么FilterChainProxy是如何构建出来的?异步
Spring Security提供了两个接口ide
Spring Security基于构造器模式,经过SecurityBuilder构造器构建对象,而SecurityConfigurer则负责对构造器进行初始化和配置。spring-boot
FilterChainProxy经过WebSecurity构造器构建。post
默认的WebSecurity在WebSecurityConfiguration.setFilterChainProxySecurityConfigurer()完成初始化,
并从Spring容器中获取SecurityConfigurers<Filter, WebSecurity>列表实现对构造器的初始化和配置。ui
package org.springframework.security.config.annotation.web.configuration; @Configuration(proxyBeanMethods = false) public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware { private WebSecurity webSecurity; private List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers; ... // 经过WebSecurity完成FilterChainProxy构建并注册到Spring容器 @Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) public Filter springSecurityFilterChain() throws Exception { ... return webSecurity.build(); } ... // 1 从spring容器中获取SecurityConfigurers<Filter, WebSecurity>配置列表 // 2 建立WebSecurity // 3 将配置列表添加到WebSecurity @Autowired(required = false) public void setFilterChainProxySecurityConfigurer( ObjectPostProcessor<Object> objectPostProcessor, @Value("#{@autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()}") List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers) throws Exception { webSecurity = objectPostProcessor .postProcess(new WebSecurity(objectPostProcessor)); ... for (SecurityConfigurer<Filter, WebSecurity> webSecurityConfigurer : webSecurityConfigurers) { webSecurity.apply(webSecurityConfigurer); } ... } ... }
SecurityFilterChain经过HttpSecurity构造器构建。
默认的HttpSecurity在WebSecurityConfigurerAdapter.init()完成初始化,该方法是WebSecurity在构建FilterChainProxy的过程当中触发,并最终完成SecurityFilterChain构建添加到FilterChainProxy中。
package org.springframework.security.config.annotation.web.configuration; @Order(100) public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> { ... private HttpSecurity http; private boolean disableDefaults; ... // 初始化WebSecurity,在WebSecurity构建FilterChainProxy的过程当中触发 public void init(final WebSecurity web) throws Exception { final HttpSecurity http = getHttp(); web.addSecurityFilterChainBuilder(http)...; } ... // 配置WebSecurity public void configure(WebSecurity web) { } ... // 建立并返回HttpSecurity @SuppressWarnings({ "rawtypes", "unchecked" }) protected final HttpSecurity getHttp() throws Exception { if (http != null) { return http; } ... http = new HttpSecurity(objectPostProcessor, authenticationBuilder, sharedObjects); if (!disableDefaults) { http .csrf().and() .addFilter(new WebAsyncManagerIntegrationFilter()) .exceptionHandling().and() .headers().and() .sessionManagement().and() .securityContext().and() .requestCache().and() .anonymous().and() .servletApi().and() .apply(new DefaultLoginPageConfigurer<>()).and() .logout(); ClassLoader classLoader = this.context.getClassLoader(); List<AbstractHttpConfigurer> defaultHttpConfigurers = SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader); for (AbstractHttpConfigurer configurer : defaultHttpConfigurers) { http.apply(configurer); } } configure(http); return http; } ... // 配置HttpSecurity protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin().and() .httpBasic(); } ... }
下面则列出了一些"苦力"过滤器(默认过滤器列表)
固然,如下过滤器一般有对应的securityConfigurer完成构建。
构建逻辑在HttpSecurity的构建过程当中,触发在其对应的SecurityConfigurer.configure(H http)中建立过滤器实例并添加到HttpSecurity中,最终添加到FilterChainProxy实例中。
1. WebAsyncManagerIntegrationFilter 支持集成Spring的异步调用 2. SecurityContextPersistenceFilter 从Session中获取SecurityContext,没有则新建,最终放入SecurityContextHolder中。 3. HeaderWriterFilter 往响应对象response中写入Header属性(Like X-Frame-Options, X-XSS-Protection and X- Content-Type-Options) 4. CsrfFilter csrf校验 5. LogoutFilter 默认拦截[POST]/logout 处理登出逻辑 6. UsernamePasswordAuthenticationFilter 默认拦截[POST]/login 处理登陆认证逻辑 6.1 第一步 封装Authentication(从request中获取认证信息封装为UsernamePasswordAuthenticationToken) 6.2 第二步 获取AuthenticationManager实例[ProviderManager] 6.3 第三步 ProviderManager基于委托者模式经过AuthenticationProvider列表完成认证 6.4 第四步 认证经过后,将Authentication放入SecurityContextHolder的SecurityContext中。 7. DefaultLoginPageGeneratingFilter 默认拦截[GET]/login 生成登陆页面 8. DefaultLogoutPageGeneratingFilter 默认拦截[POST]/login 生成登出页面 9. BasicAuthenticationFilter 认证Basic [Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==] 10. RequestCacheAwareFilter 用于用户登陆成功后,从新恢复由于登陆被打断的请求 11. SecurityContextHolderAwareRequestFilter 包装request实现servlet api的一些接口方法isUserInRole、getRemoteUser 12. AnonymousAuthenticationFilter 匿名用户认证、信息填充 13. SessionManagementFilter Session管理 14. ExceptionTranslationFilter 异常处理 15. FilterSecurityInterceptor 权限校验、未登陆拦截、无权限拦截 ...
4、自定义配置