Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)

这篇具有很好参考价值的文章主要介绍了Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

在本人经历过新版和旧版的不同的配置折磨后,决心自己写一篇介绍造福大众,不好地方,欢迎伙指出ovo

本文针对Spring Security 6.0版本的自定义配置进行介绍,其中包含自定义数据源
UserDetailsService、自定义过滤链SecurityFilterChain等内容.

一、自定义过滤链SecurityFilterChain

1.旧版

在旧版的配置中,Security需要我们写一个类去继承他的WebSecurityConfigurerAdapter并把这个配置注入到容器中

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter{
	.....
}

在继承这个类后,我们可以在WebSecurityConfigurer里面去重写WebSecurityConfigurationAdapter类里面的一些方法来实现自定义过滤链等操作
Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)
实现自定义过滤链需要重写configure(HttpSecurity http)方法

	@Override
    protected void configure(HttpSecurity http) throws Exception {
    		http
    			.mvcMatchers("/login.html")
    			.permitAll()
    			.formLogin()
    			......
				.csrf()
				.disable();
    			
            }
这个方法的参数http采用的是链式设计,我们直接 ‘.’就可以进行设置。

特别的在旧版的配置中,我们需要手动将AuthenticationManager类暴露在全局中,使我们能在其他功能实现上可以拿到这个认证管理器

	// 暴露认证管理器给全局
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean()
            throws Exception {
        return super.authenticationManagerBean();
    }

旧版整体代码

@Configuration
// Security自定义配置器"
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
	@Override
    protected void configure(HttpSecurity http) throws Exception {
    		http
    			.mvcMatchers("/login.html")
    			.permitAll()
    			.formLogin()
    			......
				.csrf()
				.disable();
    			
            }
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean()
            throws Exception {
        return super.authenticationManagerBean();
    }
}

2.新版

在新版的Spring Security里面,如果我们继续继承WebSecurityConfigurationAdapter类的话,会出现如下弃用提示

public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter

在新版中我们只需要在自定义的配置类头顶添加一个 @EnableWebSecurity 注解即可将你写的这个注入到IOC容器中

该注解源码如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
		HttpSecurityConfiguration.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {

	/**
	 * Controls debugging support for Spring Security. Default is false.
	 * @return if true, enables debug support with Spring Security
	 */
	boolean debug() default false;

}

从源码中我们可以看到内部以及实现了@Configuration注解,所有不需要我们手动注入IOC容器

在这个注解内部,作者也对新版的Spring Security配置SecurityFilterChain进行了特别说明
Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)

其中我们目前只需要注意securityFilterChain(HttpSecurity http)这个方法,这个方法就是我们配置自定义过滤链需要实现的方法

以下是实现伪代码

	@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
       		 http
                .authorizeHttpRequests((auth) -> {
                    auth
                            .mvcMatchers("/user/login")
                            .permitAll()
                            .anyRequest()
                            .authenticated();
                })
                .formLogin()
                ......
                .csrf()
                .disable()
             // 构建过滤链并返回
			return http.build();
     }

新版的实现方法不再和旧版一样在配置类里面重写方法,而是构建了一个过滤链对象并通过@Bean注解注入到IOC容器中

新版整体代码 (注意:新版AuthenticationManager认证管理器默认全局

@EnableWebSecurity
// Security自定义配置器
public class WebSecurityConfiger     {
@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
       		 http
                .authorizeHttpRequests((auth) -> {
                    auth
                            .mvcMatchers("/user/login")
                            .permitAll()
                            .anyRequest()
                            .authenticated();
                })
                .formLogin()
                ......
                .csrf()
                .disable()
             // 构建过滤链并返回
			return http.build();
     }
}

二、自定义数据源

在介绍如何配置前,我们先来看看底层是如何进行数据源认证的,下面是流程图:Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)
在整个认证流程中,我们在提交用户表单数据的时候,会先被AbstractAuthenticationProcessingFilte捕获到如何被封装为UsernamePasswordAuthenticationToken 的token 对象,然后将整个对象交给AuthenticationManager认证管理器去实现认证,而这个时候就会去数据源UserDetailService类中去进行对应的认证方式,认证成功返回UserDetails对象,否则返回null,所以我们这个时候目的就比较明确了,为实现自定义数据源,我们就需要去重新实现一个类继承自UserDetailsSerive类,然后将这个类交给AuthenticationManager认证管理器,这样我们在认证的时候,认证管理器就会使用我们自定义的数据源

那么在新旧版本又是如何进行配置的,我们往下看

1.旧版

在旧版的配置中,我们首先去实现一个自定义实体类继承自UserDetails(注意:必须把这个类需要重写一些方法,这些方法都是给认证管理器去做一些工作的,这个User类还可以拥有一些其他的字段属性,比如说username,password…建议基于数据库中的User表来设置

@Data
//@ApiModel(value = "User对象", description = "用户对象")
public class User implements UserDetails {
	
	private String username;

	private String password;
	
	.....	
	
	@Override
    @JsonIgnore
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 创建角色集合
        .........
        return grantedRoles;
    }

    @Override
    @JsonIgnore
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    @JsonIgnore
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    @JsonIgnore
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    @JsonIgnore
    public boolean isEnabled() {
        return true;
    }
}

然后是实现一个类继承UserDetailsService (注意我代码使用了mp查询数据,非mp正常在UserMapper里面写对应SQL,只要将最终查询到的用户User返回即可)

在这个类中,我们也使用了@Component注解将这个数据源交给IOC容器

@Component
// "登录数据源"
public class LoginUserDetailService implements UserDetailsService {

	// 数据库查询User信息
    private final UserMapper userMapper;

	private final RoleMapper RoleMapper

    @Autowired
    public LoginUserDetailService(UserMapper userMapper, RoleMapper roleMapper) {
        this.userMapper = userMapper;
        this.roleMapper = roleMapper;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 查询用户
        LambdaQueryWrapper<User> queryWrapper_User = new LambdaQueryWrapper<>();
        queryWrapper_User.eq(User::getUsername,username);
        User user = userMapper.selectOne(queryWrapper_User);
        // 工具类判断是否查询user对象是否有效
        if (ObjectUtils.isEmpty(user)) {
            throw new UsernameNotFoundException("用户不存在");
        }
        LambdaQueryWrapper<Role> queryWrapper_Role = new LambdaQueryWrapper<>();
        queryWrapper_Role.eq(Role::getUid,user.getId());
        List<Role> roles = roleMapper.selectList(queryWrapper_Role);
        user.setRoles(roles);
        // User类继承了UserDetails,返回时会进行向上转型,所以我们将正常查询到的user数据装进User对象返回即可
        return user;
    }
}

现在到最后一步了,回到我们的WebSecurityConfigurationAdapter实现类里面,我们使用@Autowired注入我们刚刚写的LoginUserDetailService类使用 configure(AuthenticationManagerBuilder auth) 方法将这个实例交给AuthenticationManager,下面是具体代码

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {

   @Autowired
   private LoginUserDetailService loginUserDetailService
   
   @Override
   protected void configure(HttpSecurity http) throws Exception {
   		http
   			.mvcMatchers("/login.html")
   			.permitAll()
   			.formLogin()
   			......
   			.csrf()
   			.disable();
   }
   
   @Override
   protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   		auth.userDetailsService(loginUserDetailService);
   }
   
   @Override
   @Bean
   public AuthenticationManager authenticationManagerBean()
           throws Exception {
       	return super.authenticationManagerBean();
   }
}

2.新版

新版的比较简单,直接定义好数据源,注入就可以了,无需手动到配置类中去将它提交给AuthenticationManager进行管理。

@Component
public class LoginUserDetailService implements UserDetailsService {

    private final UserMapper userMapper;

    @Autowired
    public LoginUserDetailService(UserMapper userMapper, RoleMapper roleMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
      // 数据查询
      userMapper.方法
        
        return user;
    }
}

相比旧版,跳过了手动auth.userDetailsService(loginUserDetailService),新版底层会帮你执行这一步文章来源地址https://www.toymoban.com/news/detail-473288.html

=THE END=

到了这里,关于Spring Security在6.0弃用WebSecurityConfigurationAdapter后该如何自定义配置介绍(新旧示例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Security 6.0系列【30】授权服务器篇之JOSE规范

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo

    2024年02月01日
    浏览(50)
  • Spring Security 6.0系列【14】认证篇之添加登录验证码功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 验证码 ( CAPTCHA )是“ Completely Automated Public Turing test to tell Computers and Humans Apart ”(全自动区分计算机和人类的图灵

    2023年04月09日
    浏览(53)
  • Spring Security 6.0系列【15】认证篇之实现短信验证码登录功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分网站都支持使用 手机号+短信验证码 登录,比

    2023年04月24日
    浏览(67)
  • Spring Boot 正式弃用 Java 8。。

    大家好,我是R哥。 关注 Spring 框架的都知道,因为 Spring 6.0 要求最低 JDK 17+,所以 Spring Boot 3.0 也必须 JDK 17+ 了 ,但是 3.0 出来的时候,一站式生成项目还是可以选 Java 8 的,如下图所示: 这是 Spring 提供的 一站式生成 Spring 应用的网站 ,这个网站可以帮助开发人员一键生成

    2024年02月04日
    浏览(37)
  • 【Spring Security】Spring Security 认证与授权

    在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。 3.1 默认数据库模型的认证与授权 3.1.1、资源准备 首先,在controller包下新建

    2024年02月05日
    浏览(54)
  • Spring Security入门教程,springboot整合Spring Security

    Spring Security是Spring官方推荐的认证、授权框架,功能相比Apache Shiro功能更丰富也更强大,但是使用起来更麻烦。 如果使用过Apache Shiro,学习Spring Security会比较简单一点,两种框架有很多相似的地方。 目录 一、准备工作 创建springboot项目 pom.xml application.yml 二、创建相关的类

    2024年02月05日
    浏览(49)
  • 【深入浅出Spring Security(一)】Spring Security的整体架构

    这篇博客所述主要是在读《 深入浅出Spring Security 》途中所做的笔记(之前有学Spring Security,但了解的比较浅,所以想着看这本书深入一点点,这都是因为上次一个bug调了我几天) 这本书的 pdf 网盘链接可通过微信扫下方公众号私信\\\"深入浅出Spring Security\\\"即可获取。 在 Spring

    2024年02月06日
    浏览(88)
  • Spring 6.0官方文档示例(24): replace-method的用法

    一、原始bean定义 二、replace bean定义 三、配置文件 四、主类: 五、执行结果:

    2024年02月12日
    浏览(37)
  • Spring Security OAuth2.0(5):Spring Security工作原理

    qquad Spring Security 所解决的问题就是安全访问控制,而安全访问控制功能其实就是所有进入系统的请求进行拦截,校验每个请求是否能够访问它所期望的资源。Spring Security 对Web资源的保护是通过Filter入手的,所以从这个Filter入手,逐步深入Spring Security原理。 $qquad%当初始化

    2024年02月17日
    浏览(55)
  • Spring Security OAuth2.0(3):Spring Security简单入门

    Spring Security 快速入门。 本章代码已分享至Gitee:https://gitee.com/lengcz/security-spring-security qquad Spring Secutiry 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统的一员,因此它伴随着整个Spring生态系统不断修正、升级,

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包