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

  • Post author:
  • Post category:其他




开篇

前面我们写了 4 篇

Spring Security

的实战教程, 全部基于

Springboot

搭建的.

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

因此, 从本文开始, 我们会基于

Spring Security



Springboot

的整合, 去逐步去学习

Spring Security

的工作原理.



正文

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

  1. 当我们在项目中添加了

    Spring Security

    依赖后, 即使不做任何配置, 它也默认会帮我们拦截掉所有请求.
  2. 为了修改

    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 类



  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)

方法, 它的默认行为就是

要求对所有的请求进行登录认证

.



版权声明:本文为cnm10050原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。