当我尝试运行一个应用程序时,它无法启动并抛出这个异常。
这个方法不能决定这些模式是否是Spring MVC模式。如果此端点是Spring MVC端点,请使用requestMatchers(MvcRequestMatcher);否则,请使用requestMatchers(AntPathRequestMatcher)。
我是新的Spring安全请帮助我解决这个错误
这是我的Spring安全配置类
package com.ronit.SpringSecurityTutorial.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
@Configuration
public class SecurityConfiguration {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
AuthenticationManager authManager(UserDetailsService detailsService) {
DaoAuthenticationProvider daoProvider = new DaoAuthenticationProvider();
daoProvider.setUserDetailsService(detailsService);
return new ProviderManager(daoProvider);
}
@SuppressWarnings("removal")
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.csrf(csrf -> csrf.disable()).authorizeHttpRequests(auth -> {
auth.anyRequest().authenticated();
auth.requestMatchers("/auth/**").permitAll();
auth.anyRequest().authenticated();
}).httpBasic().and().build();
}
}
字符串
这是spring Boot 应用程序
package com.ronit.SpringSecurityTutorial;
import java.util.HashSet;
import java.util.Set;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.password.PasswordEncoder;
import com.ronit.SpringSecurityTutorial.models.ApplicationUser;
import com.ronit.SpringSecurityTutorial.models.Role;
import com.ronit.SpringSecurityTutorial.repository.RoleRepository;
import com.ronit.SpringSecurityTutorial.repository.UserRepository;
@SpringBootApplication
public class SpringSecurityTutorialApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSecurityTutorialApplication.class,args);
}
@Bean
CommandLineRunner run(RoleRepository roleRepository, UserRepository userRepository,
PasswordEncoder passwordEncoder) {
return args -> {
if (roleRepository.findByAuthority("ADMIN").isPresent())
return;
Role adminRole = roleRepository.save(new Role("ADMIN"));
roleRepository.save(new Role("USER"));
Set<Role> roles = new HashSet<>();
roles.add(adminRole);
ApplicationUser admin = new
ApplicationUser(1, "Admin", passwordEncoder.encode("Password"), roles);
userRepository.save(admin);
};
}
}
型
这是pom.xml中的依赖项
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
型
这是发生错误的控制台部分
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
型
application.properties文件中没有与安全相关的配置。
我在谷歌上搜索了这个,发现了一些堆栈溢出的页面,但没有一个使用类似的配置,以我的。
我已经看了一个在线教程,并作出了这一点,我按照每一步正确,但我的配置是不工作。
应用程序正在停止并立即终止。
我在应用程序的配置中使用了 Boot 3和SpringSecurity 6
1条答案
按热度按时间rjee0c151#
我相信将来会有更好的方法来处理这个问题。但现在看来,这是可行的:
在Tomcat中做了一个非常简单的poc war web应用程序。已调试此方法-
org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry.requestMatchers(HttpMethod方法,String...模式)
已研究https://spring.io/security/cve-2023-34035
就在上面提到的方法中的下面几行之前,我检查了注册对象中的内容。
isTrue(registrations.size()== 1,“此方法无法决定这些模式是否为SpringMVC模式。如果此端点是Spring MVC端点,请使用requestMatchers(MvcRequestMatcher);否则,请使用requestMatchers(AntPathRequestMatcher)。”);
发现是注册的
字符串
在https://spring.io/security/cve-2023-34035中,他们提到“有时候不需要这些额外的servlet。例如,某些servlet容器将添加一个DefaultServlet,DispatcherServlet将有效地替换该Servlet。在许多情况下,这样的servlet可以从容器的全局配置中删除。
他们的意思是我们应该编辑apache-tomcat-10.1.10\conf\web.xml。
我们应该注解掉web.xml中的org.apache. Catalina .servlets.DefaultServlet、org. apache. jasper. servlet. JspServlet的注册。我们还应该删除同一web.xml中的Map条目
对于其他servlet容器,我们可以考虑类似的概念。
另一个选项是执行他们在“For a example employment,please see following the Spring Security sample application and the corresponding diff”中建议的操作。
我已经格式化了这个我最好的希望有人会进一步编辑它
希望这对你有帮助