开篇
前面我们写了 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)
方法, 它的默认行为就是
要求对所有的请求进行登录认证
.