无法解析 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>
Gabriel 提问于2022-12-10
2 个回答
#1楼 已采纳
得票数 18

antMatchers()以及mvcMathcers() regexMatchers())中,已经被废弃,并在Spring Security 6.0中被删除。因此,你不能在Spring Boot 3项目中使用它们。

如果你想知道这一变化背后的理由是什么,请看这个链接:去掉尾部斜线匹配

重载方法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();
}
Alexander Ivanchenko 提问于2022-12-10
Alexander Ivanchenko 修改于2023-03-24
非常感谢,看来我在暂停的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()

hongyu yang 提问于2023-02-23
hongyu yang 修改于2023-02-23