小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

WebSecurityConfigurerAdapter被弃用Spring Security基于组件化的配置和使用

# Spring,spring,java,spring security 额外说明

收录于:15天前

在Spring Security 5.7及之后的版本中WebSecurityConfigurerAdapter将被启用,安全框架将转向基于组件的安全配置。

Spring Security 官方文档

没有 WebSecurityConfigurerAdapter 的 Spring Security

如果使用的Spring Boot版本高于或低于2.7.0且Spring Security版本高于5.7,则会出现以下提示:

在这里插入图片描述

1、被启用的原因是官方推荐开发正使用组件的(component-based)的安全配置。Spring的IOC容器可以管理一切Bean,Spring boot也是基于自动配置的,要实现某个功能还需要实现继承配置类,实现配置类的方法再DL注入到IOC中,这样显然是不方便的。
2、在组件化配置中,需要实现某些功能直接生产一一个该类型的Bean通过@Bean注解注入到IOC容器,覆盖spring boot默认配置,这种方式更加方便不用实现接口在重写方法,还能尽可能的减少配置类的数量。

在了解组件化配置时,首先需要了解 Spring Security - Lambda DSL。该项目已发布,包括对 DSL 的增强,允许使用 lambda 来配置 HTTP 安全性。

在Lambda DSL中,不需要使用 .及()方法。该 HTTP安全性实例在调用lambda方法后自动返回以进行进一步配置。lambda表达式it ->{}的快捷方式。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
        http
            .authorizeRequests(authorizeRequests ->
                authorizeRequests
                    .antMatchers("/blog/**").permitAll()
                    .anyRequest().authenticated()
            )
            .formLogin(formLogin ->
                formLogin
                    .loginPage("/login")
                    .permitAll()
            )
            .rememberMe(withDefaults());
    }
}
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
        http
            .authorizeRequests()
                .antMatchers("/blog/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .rememberMe();
    }
}

这样的好处是是配置更具有可读性,不需要再使用.and()返回初始对象再重新配置规则。Spring Security-Lambda DSL

如果读者仍然习惯于WebSecurityConfigurerAdapter的开发,也可以实现其父接口WebSecurityConfigurer,不过还是推荐组件化配置。
在这里插入图片描述

在Spring Security主要实现了两个个功能,身份认证,权限认证。在最新的组件化配置中两个功能都可以通过组件化配置完成。对应的组件类型分别是UserDetailsServicePasswordEncoderSecurityFilterChain

SecurityFilterChain这个新的类的作用是代替了WebSecurityConfigurerAdapterconfigure方法,因此不需要再去实现WebSecurityConfigurerAdapter类后再重写方法了,直接生产一个SecurityFilterChain的实例即可。

@Configuration
public class SecurityConfiguration {
    

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

配置也可旧版本的HttpSecurity配置一致,也支持Spring Security - Lambda DSL,小编还是熟悉.and()的过滤器链的配置方式,接下来也会以该方式演示。

组件化配置过滤器链:

@Configuration
public class WebSecurityConfig {
    


    //用户认证
    @Bean(name = "userDetailsService")
    UserDetailsService getUserService(){
    
        return new UserDetailsService() {
    
            @Override
            public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
                List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
                return new User("admin",new BCryptPasswordEncoder().encode("123"),auths);
            }
        };

    }

    //过滤器链配置
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                //会话状态代理接口
                .loginProcessingUrl("/doLogin")
                .successForwardUrl("/index")
                .permitAll()
                .and()
                .csrf().disable();
        return http.build();
    }



    //密码加密
    @Bean(name = "passwordEncoder")
    PasswordEncoder encoder(){
    
        return  new BCryptPasswordEncoder();
    }


}

SecurityFilterChain组件需要返回一个该类型的实例,在旧版本的配置中是无返回值的,如下
在这里插入图片描述

SecurityFilterChain组件中式有返回值的且返回值为HttpSecurity.build()类型,该类型肯定是前者的实现类了,如下,提供了三个方法返回实现类:

在这里插入图片描述

这三种方法都是用来实现过滤器链的。小编还不清楚他们的关系。我们看一下源代码。可以使用这里的build方法来实现该功能。

在这里插入图片描述

WebSecurityConfigurerAdapter接口中有很多方法,如下:

alt
在新的组件化配置中都有对应的实现方案,如WebSecurityCustomizer替代void configure(WebSecurity web)方法。

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    
    return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
}

更多细节请移步官方文档没有 WebSecurityConfigurerAdapter 的 Spring Security

. . .

相关推荐

额外说明

为什么我们不能在 foreach 循环中对元素执行删除/添加操作?

一、介绍foreach 循环 foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素。 Java语言从JDK 1.5.0开始引入foreach循环。在遍历数组、集合方面,foreach为开发

额外说明

centos7离线拨号上网

文章目录 前言 一.准备安装包拷贝到u盘 二.挂载u盘 三. 配置拨号工具 四.自动拨号 前言 由于去了新地方,公司管住.我的nuc服务器寸步不离我工作的地方,但是没想到要拨号上网…本文借鉴了 CentOS 7 离线拨号(PPPOE) 一.准备安装包拷贝

额外说明

大数据与机器学习-大数据预测

大数据预测 量化交易 量化交易

额外说明

Unity 实战项目 ☀️| Unity接入 百度语音识别 SDK!一篇文章搞定在Unity中实现语音识别!(万字完整教程)

-博客主页:https://blog.csdn.net/zhangay1998 -欢迎点赞 - 收藏 ⭐留言 - 如有错误敬请指正! -本文由 呆呆敲代码的小Y 原创,首发于 CSDN- -未来很长,值得我们全力奔赴更美好的生活✨ 目录 -前言 -接入百

额外说明

java 拼音搜索功能设计与实现

前言 在搜索场景中,有下面这种需求,即搜索用户的中文拼音,简拼或全拼,甚至拼音的前几位字母时,能够快速检索出来,如下所示 我们希望得到下面这种效果 这就是一个典型的利用拼音检索功能实现对用户数据搜索的业务,这个看起来简单但实用的功能如何实现呢? 实现思路

额外说明

kubeSphere部署kubernetes多集群联邦

kubeSphere多集群联邦 KubeSphere v3.0.0进行了重大升级,其中多集群管理功能是重要更新之一。 使用KubeSphere,用户可以添加或删除集群。可以以统一的方式管理部署在任何基础架构(例如Amazon EKS和Google Kub

额外说明

kubernetes部署dashboard可视化插件

Dashboard简介 在 Kubernetes 社区中,有一个很受欢迎的 Dashboard 项目,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状

额外说明

【Java 进阶篇】Java Web 编写注册页面案例

当涉及到创建一个Java Web注册页面时,你将需要涵盖很多不同的主题,包括HTML、CSS、Java Servlet和数据库连接。在这篇文章中,我们将详细介绍每个步骤,以帮助你创建一个完整的注册页面。 1. 介绍 注册页面是许多Web应用程序的关键组成

额外说明

Java进制转换

各进制 转换成其它进制 的 字符串,及各进制转换为其它进制(非字符串),查找备忘录。Java进制转换。 一.二进制 转 十进制 及其它 :   (1)转为十进制(整型): int i = Integer.valueOf("1111",2); (2)转为十

额外说明

Nacos: 详细介绍、使用教程和示例

Nacos: 详细介绍、使用教程和示例 什么是 Nacos? Nacos(全称为 “Naming and Configuration Service”)是一个开源的分布式服务发现和配置管理平台,由阿里巴巴集团开发并开源。Nacos 提供了服务注册、发现、

ads via 小工具