什么? 就只是加了一个 Spring Security 依赖, 所有接口都无法访问了?

开篇

前面我们写了 4 篇 Spring Security 的实战教程, 全部基于 Springboot 搭建的.

虽然我们学会了怎么用, 但是里面的原理还没搞清楚.

因此, 从本文开始, 我们会基于 Spring SecuritySpringboot 的整合, 去逐步去学习 Spring Security 的工作原理.

正文

通过前面的 4 篇实战教程, 我们暂时得到了如下结论:

  1. 当我们在项目中添加了 Spring Security 依赖后, 即使不做任何配置, 它也默认会帮我们拦截掉所有请求.
  2. 为了修改 Spring Security 的默认行为, 我们需要做一些配置, 也就是通过重写 WebSecurityConfigurerAdapterconfigure(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 类

  1. @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) 可以看出,
    当项目中没有配置 WebSecurityConfigurerAdapter 时, 这个配置类才会生效.

  2. 当这个配置类生效后, 会帮我们配置一个默认的 WebSecurityConfigurerAdapter

  3. 由前面可知, 通过配置 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) 方法, 它的默认行为就是 要求对所有的请求进行登录认证.

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值