无法解析 AuthorizationManagerRequestMatcherRegistry 中的方法“antMatchers()”
回答 2
浏览 9386
2022-12-10
我目前正在遵循Spring文档和一些关于Web安全的教程。但现在我遇到一个问题,我无法调用方法antMatchers
。这是我在构建项目时得到的错误:
java: cannot find symbol
symbol: method antMatchers(java.lang.String)
location: variable requests of type org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer<org.springframework.security.config.annotation.web.builders.HttpSecurity>.AuthorizationManagerRequestMatcherRegistry
根据我的理解,我应该可以使用这个方法,所以我可以允许或不允许HTTP请求到某个URL。所以我的问题是,为什么我不能使用antMatchers()
方法?
SecurityConfiguration
类:
package de.gabriel.vertretungsplan.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.antMatchers("/vertretungsplan").hasAnyRole("SCHUELER", "LEHRER", "VERWALTUNG")
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
}
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>de.gabriel</groupId>
<artifactId>vertretungsplan</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>vertretungsplan</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<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>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2 个回答
#1楼
已采纳
得票数 18
在(以及antMatchers()
和 mvcMathcers()
)中,已经被废弃,并在Spring Security 6.0中被删除。因此,你不能在Spring Boot 3项目中使用它们。regexMatchers()
如果你想知道这一变化背后的理由是什么,请看这个链接:去掉尾部斜线匹配。
重载方法requestMatchers()
被提供作为保障请求的统一手段。它促进了已从API中删除的配置方法的所有功能。
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(requests -> requests
.requestMatchers("/vertretungsplan").hasAnyRole("SCHUELER", "LEHRER", "VERWALTUNG")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
)
.logout(logout -> logout
.permitAll());
return http.build();
}
非常感谢,看来我在暂停的6个月里错过了很多东西😅 他们也从javax.persistenc变成了jakarte.persistence,现在又有了antMatchers的事情。看来我现在必须要适应所有的新事物了,但真的很感谢你的回答和你提供的链接^^。
- Gabriel 2022-12-10
@Gabriel 最新的Spring版本中出现了许多有趣的东西,我想在Spring安全方面最重要的变化(如果你在你的项目中使用OAuth 2.0或OpenID)是一个新的、可生产的授权服务器。
- Alexander Ivanchenko 2022-12-10
是的,这听起来很有趣,但目前我只使用JPA认证或想使用,但因为这个更新是新的,或者至少看起来是这样,所以外面没有那么多的教程,所以我必须看整个新的Amigoscode课程,关于spring security xD。
- Gabriel 2022-12-10
为什么你认为这个成功了:
.requestMatchers("/user/**").hasAuthority("USER")
,而这个却没有:.requestMatchers("/user/**").hasRole("USER")
?即使我明确地删除了默认的前缀,并且从未设置或在任何地方使用:@Bean public GrantedAuthorityDefaults grantedAuthorityDefaults() { return new GrantedAuthorityDefaults(""); }
.当我用WebSecurityConfigurerAdapter
配置Spring Security时,hasRole()
工作得很好(只要我删除了前缀)。
- Sergey Zolotarev 2023-04-02
@SergeyZolotarev 没有足够的代码来重现这个问题,但我将尝试澄清一些事情。首先,在Spring Security中,我们有一个
GrantedAuthority
的概念,它可以被表示为角色或授权(建议坚持使用这两种中的一种,虽然技术上你可以同时使用,但会造成混乱)。从本质上讲,角色和授权都是普通的字符串(GrantedAuthority
接口定义了一个单一的方法getAuthority()
返回一个字符串)。角色描述你是谁(USER、ADMIN、VISITOR等),授权描述你能做什么(READ、WRITE等)。
- Alexander Ivanchenko 2023-04-03
#2楼
得票数 1
.requestMatchers("/assets/**").permitAll()
对我来说是有效的,但请确保你检查你的链接与你插入的地方是一样的。
举例来说
If you use:
<link href="assets/css/style.css" rel="stylesheet">
Here you need to use:
.requestMatchers("/assets/**").permitAll()
If you use:
<link href="resources/**" rel="stylesheet">
Here you need to use:
.requestMatchers("/resources/**").permitAll()