开篇
   
    前面我们写了 4 篇
    
     Spring Security
    
    的实战教程, 全部基于
    
     Springboot
    
    搭建的.
   
- 
     
 Spring Security 入门 – 01 将 Spring security 引入到工程
 
- 
     
 Spring security 入门 – 02 自定义用户登录页面和登录处理逻辑
 
- 
     
 Spring security 入门 – 03 自定义登录成功后的处理逻辑
 
- 
     
 Spring security 入门 – 04整合 jwt
 
虽然我们学会了怎么用, 但是里面的原理还没搞清楚.
    因此, 从本文开始, 我们会基于
    
     Spring Security
    
    与
    
     Springboot
    
    的整合, 去逐步去学习
    
     Spring Security
    
    的工作原理.
   
    
    
    正文
   
通过前面的 4 篇实战教程, 我们暂时得到了如下结论:
- 
     当我们在项目中添加了
 
 Spring Security
 
 依赖后, 即使不做任何配置, 它也默认会帮我们拦截掉所有请求.
- 
     为了修改
 
 Spring Security
 
 的默认行为, 我们需要做一些配置, 也就是通过重写
 
 WebSecurityConfigurerAdapter
 
 的
 
 configure(HttpSecurity http)
 
 方法.
    那么问题来了, 为什么仅仅加了一个
    
     Spring Security
    
    依赖, 就可以拦截请求了?
   
    答案自然跟
    
     Springboot
    
    的自动装配有关系.
   
    
    
    SecurityAutoConfiguration 装配类
   
    通过
    
     @Import
    
    注解, 可以找到
    
     SpringBootWebSecurityConfiguration
    
    类
   
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
@EnableConfigurationProperties(SecurityProperties.class)
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
		SecurityDataConfiguration.class })
public class SecurityAutoConfiguration {
	@Bean
	@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
	public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
		return new DefaultAuthenticationEventPublisher(publisher);
	}
}
    
    
    SpringBootWebSecurityConfiguration 类
   
- 
从 
 
 @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
 
 可以看出,
 
 当项目中没有配置
 
 WebSecurityConfigurerAdapter
 
 时, 这个配置类才会生效.
- 
当这个配置类生效后, 会帮我们配置一个默认的 
 
 WebSecurityConfigurerAdapter
 
- 
由前面可知, 通过配置 
 
 WebSecurityConfigurerAdapter
 
 可以实现定义拦截方式.
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
@ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
public class SpringBootWebSecurityConfiguration {
	@Configuration(proxyBeanMethods = false)
	@Order(SecurityProperties.BASIC_AUTH_ORDER)
	static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {
	}
}
    
    
    WebSecurityConfigurerAdapter 的默认行为
   
从下面的默认配置可以得知, 默认的配置是所有的请求都需要登录认证.
protected void configure(HttpSecurity http) throws Exception {
	
    http
       .authorizeRequests()
       // 重点
       .anyRequest().authenticated()
       .and()
       .formLogin().and()
	.httpBasic();
    }
    
    
    总结
   
    当我们的
    
     Springboot
    
    工程引入
    
     Spring Security
    
    依赖后, 项目中的 “安全机制” 就已经开启了.
   
    因为根据
    
     Spring boot
    
    的自动装配原理, 在加载
    
     SecurityAutoConfiguration
    
    配置类时, 会再加载
    
     SpringBootWebSecurityConfiguration
    
    配置类.
   
    而在
    
     SpringBootWebSecurityConfiguration
    
    类中, 默认帮我们初始化了一个
    
     WebSecurityConfigurerAdapter
    
    类.
   
    
     WebSecurityConfigurerAdapter
    
    的有一个作用就是
    
     配置访问请求需要的权限
    
    .
   
    如果不覆盖此类的
    
     configure(HttpSecurity http)
    
    方法, 它的默认行为就是
    
     要求对所有的请求进行登录认证
    
    .
   
 
