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

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

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

收录于:157天前

在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

. . .

相关推荐

额外说明

MATLAB蒙特卡罗法求圆周率(详细代码解释)

一 计算原理         一个正方形内部内切一个圆,设圆的半径为r,则正方体的边长为2r。在该正方体内部,随机投掷n个均匀分布的点,统计投掷点在圆内的与总点数的比例,得出圆的近似面积,就是π的值。理论上,n越大,实验次数越多,计算得出的π的值就越精准

额外说明

分享一个C++ AES加密算法

#ifndef _AES_H_ #define _AES_H_ #ifndef BYTE #define BYTE unsigned char #endif //typedef unsigned char BYTE; typedef unsigned c

额外说明

MyBatis配置文件 —— 相关标签详解

目录 相关导读 一、Mybatis配置文件 — properties标签 二、Mybatis配置文件 — settings标签 三、Mybatis配置文件 — plugins标签

额外说明

[Windows]如何快速安装双系统

磁盘整备 这个直接用Windows的磁盘管理工具就行,压缩卷,合并卷,生成新简单卷。 如果由于顺序问题无法合并,用CMD的命令调一下顺序。 不在一个物理盘上的空间自然无法逻辑合并。 下载装机大师 用下来这个免费的很不错:http://sd.zjdashi

额外说明

全球最杰出的14位程序员

近日,ITWorld整理全球最杰出的14位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1. Jon Skeet 个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的问答量保持在425个左右。 个人简介/主要

额外说明

远程控制家里电脑的N种方案

最近完美实现了从远程局域网连接家里电脑,进行远程控制,这里记录一下几种不同的方案。 首先要看看家里电脑是用的哪个运营商的宽带,如果是中国电信的宽带,那么实现起来是最容易方便的,那就是和中国电信申请分配一个公网的IP地址,但是如果是中国移动的宽带,那么就比

额外说明

多种方法解决[Vue warn]: Cannot set reactive property on undefined, null, or primitive value: xxx 的警告

文章目录 1. 复现警告 2. 分析警告 3. 解决警告 3.1 解决方法一 3.2 解决方法二 1. 复现警告 今天使用vue写好订单列表的页面,如下图所示: 咋一看,没有什么问题。但我们通过F12或者Fn + F12,就会看到如下错误: 即Canno

额外说明

13. Vuepress2.x 部署站点的基础路径从配置文件中读取

收到需求,站点要部署到 非根路径 下,且将来会根据 版本号 区分不同的基础路径。需要从统一的文件中读取,方便其它 js 文件和 config.js 配置统一读取。 目录 docs\.vuepress\public\cfg\ 下新建文件 version.j

额外说明

使用soap的header进行身份验证

新建一个webService site 1.新建一个 ValidationSoapHeader.cs /// <summary> /// Summary description for ePhoneCredentials /// </summary> p

额外说明

IDEA实现Maven项目创建并连接Tomcat

Maven简介 Maven是Apache下纯用Java开发的开源项目。它是一个项目管理工具,使用Maven来构建和管理Java项目的依赖关系。 项目构建是一个项目从编写源码到编译、测试、运行、打包、部署的过程。 Maven项目的依赖管理所依赖的jar包不

ads via 小工具