为什么引入SpringSecurity依赖就会对所有的请求进行控制
引入Spring Security后Springboot会对这个类SpringBootWebSecurityConfiguration
进行默认配置
/*
类的生效条件
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
//满足条件:运行的容器是一个Servlet容器
@ConditionalOnWebApplication(type = Type.SERVLET)
class SpringBootWebSecurityConfiguration {
@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
//传入Http请求
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
//authorizeRequests() 开启请求的权限认证
//anyRequest() 任何请求都开启
//authenticated() 认证
//支持formLogin()【表单认证】和httpBasic() 认证
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
return http.build();
}
}
满足条件
当运行的容器是一个Servlet容器
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnDefaultWebSecurity
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(DefaultWebSecurityCondition.class)
public @interface ConditionalOnDefaultWebSecurity {
}
class DefaultWebSecurityCondition extends AllNestedConditions {
DefaultWebSecurityCondition() {
super(ConfigurationPhase.REGISTER_BEAN);
}
//在当前的类路径中有 SecurityFilterChain、HttpSecurity这两个类就会启用默认配置
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
static class Classes {
}
//在现有的工厂中没有找到WebSecurityConfigurerAdapter、SecurityFilterChain类的实例就会生效
//如果我们自己写的类继承了WebSecurityConfigurerAdapter、SecurityFilterChain这两个类的实例
//当前条件不满足 默认情况就会失效
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
static class Beans {
}
}
总结:
条件一:
当运行的容器是一个Servlet容器
条件二
在当前的类路径中有
SecurityFilterChain
、HttpSecurity
这两个类就会启用默认配置
在现有的工厂中没有找到WebSecurityConfigurerAdapter
、SecurityFilterChain
类的实例就会生效
当我们不需要启用默认配置时只需要自定义方法覆盖WebSecurityConfigurerAdapter
即可
@Configuration
@Slf4j
public class MyWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//实现自己的逻辑即可
}
}