如何修复 Spring AuthorizeRequests 已弃用的问题?

GOL*_*oFA 42 java spring

Spring 已更新,称authorizeRequests 已弃用,antMatchers 已删除。有人可以展示 SpringSecurity 应该是什么样子吗?

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = false, securedEnabled = true)
public class SecurityConfig {

    private final PersonDetailsService personDetailsService;

    @Autowired
    public SecurityConfig(PersonDetailsService personDetailsService) {
        this.personDetailsService = personDetailsService;
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/, /login, /signup, /logout").permitAll()
                .requestMatchers("/api").hasRole("ADMIN")
                .requestMatchers("/user").hasRole("USER")
                .anyRequest().authenticated())
                .logout().logoutUrl("/logout").logoutSuccessUrl("/").and()
                .formLogin().loginPage("/login").loginProcessingUrl("/login").defaultSuccessUrl("/user").failureUrl("/login?error");
        return http.build();
    }
}
Run Code Online (Sandbox Code Playgroud)

看了文档、stackoverflow等没有找到解决办法。

小智 94

您可以使用authorizeHttpRequests代替authorizeRequestsrequestMatchers代替antMatchers

例如:

http.authorizeHttpRequests()
  .requestMatchers("/authentication/**").permitAll()
  .requestMatchers("/h2/**").permitAll()
  .anyRequest().authenticated();
Run Code Online (Sandbox Code Playgroud)

  • **`authorizeHttpRequests()` 也已弃用**,请参阅[文档](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation /web/builders/HttpSecurity.html#authorizeHttpRequests()) (19认同)
  • @MarcoLackovic 是的,但只是从 Spring Boot 3.1 开始,它还没有进入 3.0。有点快速弃用。 (2认同)

Seb*_*oek 22

@Tyler2P的答案适用于 Spring Boot 3.0,但在 Spring Boot 3.1 中 authorizeHttpRequests() 已被弃用,取而代之的是不同的 API。

现在应该是

http.authorizeHttpRequests(authz -> authz
  .requestMatchers("/authentication/**").permitAll()
  .requestMatchers("/h2/**").permitAll()
  .anyRequest().authenticated());
Run Code Online (Sandbox Code Playgroud)

迁移指南中也提到了这一点:https ://docs.spring.io/spring-security/reference/5.8/migration/servlet/config.html

另请注意,在更高版本的 Spring Boot 3.1 中,使用 lambda 的中间方法authorizeRequests也已被弃用,取而代之的是authorizeHttpRequests,但这确实改变了功能。其一,我们的自定义身份验证提供程序不再被调用,因此我们还无法迁移。


GKi*_*lin 5

对于 Spring Boot 3.1.0 我的迁移filterChain(HttpSecurity http)示例:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.securityMatcher("/api/**").authorizeHttpRequests(rmr -> rmr
            .requestMatchers("/api/admin/**").hasRole(Role.ADMIN.name())
            .requestMatchers("/api/**").authenticated()
    ).httpBasic(httpbc -> httpbc
            .authenticationEntryPoint(authenticationEntryPoint)
    ).sessionManagement(smc -> smc
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    ).csrf(AbstractHttpConfigurer::disable);
    return http.build();
}
Run Code Online (Sandbox Code Playgroud)

示例代码可以在https://github.com/JavaOPs/bootjava/tree/patched找到