Spring security 入门

265 阅读3分钟

说明:

本文章讲解讲基于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 聚集在一起,就具备了一定的安全性了。
 ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/412717671c8842169278a39f090c4979~tplv-k3u1fbpfcp-watermark.image)

spring security 内置filter清单

  • ChannelProcessingFilter,处理协议相关
  • SecurityContextPersistenceFilter 生成一个伴随当前请求的对象,存储认证信息
  • ConcurrentSessionFilter 处理并发会话相关
  • UsernamePasswordAuthenticationFilter 处理用户名和密码登录
  • CasAuthenticationFilter 处理基于cas登录
  • SecurityContextHolderAwareRequestFilter 衔接servlet api中安全方法
  • RememberMeAuthenticationFilter 处理记住登录,免登录
  • AnonymousAuthenticationFilter 处理匿名登录
  • ExceptionTranslationFilter 异常处理,捕获认证异常,认证失败可以生成
  • FilterSecurityInterceptor 保护web uri,不合法情况下跑出异常
这里我们不需要详细了解每一种filter的作用,只需要知道该filter 大概的作用即可。我们可以按照要需要自己组织一条FilterChainProxy 来实现认证功能

使用spring security 提供的配置功能配置自己的安全链

  1. 使用spring initiallizr创建一个空项目

  2. 直接启动,默认spring boot 自动配置会为我们自动配置一条安全链条,从日志中我们可以看到随机密码,用户名为 user,此时我们需要登录才能访问。

  3. 如下看图,我们可以看到我们当前的web中有一条特殊的filter

  4. 该特殊的filter实际为FilterChainProxy并且其可能包含多个DefaultSecurityFilterChain,此处只有一条,DefaultSecurityFilterChain内容如下图

  5. 接下来我们定制一下安全链,我需要关闭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
        }
    }
    
  6. 定制后的安全链条如下,我们不需要的filter 功能点已经被清理了。

  7. 当然我们也可以禁止掉基于用户名和密码的登录。

结束

本文章旨在帮助大家队spring security 有一个全局的概念,目前介绍的知识可能不能足以实战,但却对理解spring security 非常有帮助。