说明:
本文章讲解讲基于servlet 来讲解,webFlux同理。使用的spring security版本为5.1。
Spring security 是什么?
spring security 一种web安全认证framework,framework 设计简单实用,灵活,用户可以自由的选择配置自己需要的安全级别。
同时用户可以在功能不满足需要的情况下,扩展相应的功能。得益于framework 良好的设计,我们扩展与管理自己实现的功能都非常简单。
spring security 支持基于Servlet,与基于webFlux 的应用。默认spring security 实现了常见的认证模式,用户只需要按需要配置即可。例如 OAuth 2.0,ACl,CAS,OpenID 等。
Spring security 核心作用
- 约定了认证流程,确定了各部分组建职责
- 实现了常用的认证功能
- 提供了一种可配置的模式,供用户自由配置。
掌握好以上三点,玩转spring security ,就很容易了。
spring security 流程讲解
如下图,外部请求进来时,除了会通过正常filter外,还会通过一个特殊的filter,就是filterChainProxy, 首先 FilterChainProxy 本身是一个filter,只不过他的作用
是将认证相关的filter都组织在一起,这样多个认证功能的filter 聚集在一起,就具备了一定的安全性了。

spring security 内置filter清单
- ChannelProcessingFilter,处理协议相关
- SecurityContextPersistenceFilter 生成一个伴随当前请求的对象,存储认证信息
- ConcurrentSessionFilter 处理并发会话相关
- UsernamePasswordAuthenticationFilter 处理用户名和密码登录
- CasAuthenticationFilter 处理基于cas登录
- SecurityContextHolderAwareRequestFilter 衔接servlet api中安全方法
- RememberMeAuthenticationFilter 处理记住登录,免登录
- AnonymousAuthenticationFilter 处理匿名登录
- ExceptionTranslationFilter 异常处理,捕获认证异常,认证失败可以生成
- FilterSecurityInterceptor 保护web uri,不合法情况下跑出异常
这里我们不需要详细了解每一种filter的作用,只需要知道该filter 大概的作用即可。我们可以按照要需要自己组织一条FilterChainProxy 来实现认证功能
使用spring security 提供的配置功能配置自己的安全链
-
使用spring initiallizr创建一个空项目
-
直接启动,默认spring boot 自动配置会为我们自动配置一条安全链条,从日志中我们可以看到随机密码,用户名为 user,此时我们需要登录才能访问。
-
如下看图,我们可以看到我们当前的web中有一条特殊的filter
-
该特殊的filter实际为FilterChainProxy并且其可能包含多个DefaultSecurityFilterChain,此处只有一条,DefaultSecurityFilterChain内容如下图
-
接下来我们定制一下安全链,我需要关闭crs,禁止匿名用户访问,关闭basic认证,我们添加如下类即可。
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated()// 所有请求都需要认证 .and() .formLogin().and() // .httpBasic().and() 不配置basic .anonymous().disable() //关闭匿名 .csrf().disable(); //关闭csrf } } -
定制后的安全链条如下,我们不需要的filter 功能点已经被清理了。
-
当然我们也可以禁止掉基于用户名和密码的登录。
结束
本文章旨在帮助大家队spring security 有一个全局的概念,目前介绍的知识可能不能足以实战,但却对理解spring security 非常有帮助。