Как исправить, что 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();
}