Как исправить, что Spring authorizeRequests устарел?

Spring обновлен, говорится, что authorizeRequests устарела, antMatchers удалены. Может ли кто-нибудь показать, как SpringSecurity должен выглядеть как rn?

      @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();
    }
}

Читал документацию, stackoverflow и т.п. решения не нашел.

5 ответов

Ответ @ в пользу другого API. user14267427

Теперь должно быть

      http.authorizeHttpRequests(authz -> authz
  .requestMatchers("/authentication/**").permitAll()
  .requestMatchers("/h2/**").permitAll()
  .anyRequest().authenticated());

Это также упоминается в руководстве по миграции: https://docs.spring.io/spring-security/reference/5.8/migration/servlet/config.html .

Для Spring Boot 3.1.0 моя миграцияобразец:

      @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();
}

Этот код у меня работает нормально. Я использую Spring Tool Suite 4 (последняя версия).

@Configuration публичный класс MyConfig {

      @Bean
public UserDetailsService getUserDetailsService() {
    return new UserDetailsServiceImpl();
}

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

public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    
    daoAuthenticationProvider.setUserDetailsService(getUserDetailsService());
    daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
    
    return daoAuthenticationProvider;
}

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 
    http.authorizeHttpRequests().requestMatchers("/Admin/**").hasRole("ADMIN")
    .requestMatchers("/user/**").hasRole("USER")
    .requestMatchers("/**").permitAll().and().formLogin().and().csrf().disable();
            
    return http.build();
}

Код ниже работает для Spring Boot 3.1.x, обновите свой код соответствующим образом.

      @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
        return http.csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(auth ->
                        auth.requestMatchers("/api").permitAll()
                                .requestMatchers("/api/**")
                                .authenticated()
                )
                .httpBasic(Customizer.withDefaults()).build();
    }

Как упоминалось в документации , вы можете использоватьauthorizeHttpRequests():

      @Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests((authorizeHttpRequests) ->
        authorizeHttpRequests
                .requestMatchers("/**").hasRole("USER")
                .requestMatchers("/admin/**").hasRole("ADMIN")
        );
    return http.build();
}
Другие вопросы по тегам