Spring security 6.0 -无法配置对公共资源的访问

niknxzdl  于 2022-12-26  发布在  Spring
关注(0)|答案(2)|浏览(281)

Spring Security默认为所有端点提供强制身份验证,无论我们是否添加了 * 基于角色的 * 安全性。

  • 下面是设置pom.xml
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>

        <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-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
  • 组态

x一个一个一个一个x一个一个二个一个x一个一个三个一个
401未授权
此外,此筛选器可以安全地跳过对端点具有USER权限的用户(/admin)。
为了访问公共端点,您需要输入凭据。但是我指定的设置应该提供公共访问。
我在不同版本的Security上反复遇到过这样的问题,目前还没有找到解释。
也许有人对如何绕过这个问题有想法(什么时候会发生),为什么会发生这种情况?

jjhzyzn0

jjhzyzn01#

@Configuration
public class MySecurityConfigurer {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.csrf()
                .disable()
                .authorizeHttpRequests()
                .requestMatchers("/home/**")
                .permitAll()
                .requestMatchers(HttpMethod.DELETE)
                .hasRole("ADMIN")
                .requestMatchers("/admin/**")
                .hasRole("ADMIN")
                .requestMatchers("/protected/**")
                .hasAnyRole("USER", "ADMIN")
                .and()
                .httpBasic()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        return http.build();
    }
}

我已删除注解**@EnableWebSecurity。**
以下是我的发现:
需要**@EnableWebSecurity**注解才能完全禁用默认Web应用程序安全配置。

@EnableWebSecurity导致Sping Boot 自动配置被取消,但是,这不会取消身份验证管理器配置的默认设置或Actuator的安全性设置。

此外,如果使用Sping Boot ,在类的自动配置过程中,它将自动配置安全模块的组件。
因此,如果您在应用程序中的任何位置使用**@EnableWebSecurity定义@Configuration**,它将禁用Sping Boot 中的默认Web应用程序安全设置。
应用程序现在执行预期的行为。

sqougxex

sqougxex2#

SpringSecurity在默认情况下有效地保护了所有端点,这是可取的,因为如果您忘记配置一些东西,安全漏洞可能会非常快地发生。
也就是说,您可以通过使用permitAll方法显式地允许每个人使用某些端点,而不会干扰注解。
在当前设置中,您可以按如下方式缩短:

@Configuration
@EnableWebSecurity
public class MySecurityConfigurer {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.csrf()
                .disable()
                .authorizeHttpRequests()
                .requestMatchers("/home/**").permitAll()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/protected/**").hasAnyRole("USER", "ADMIN")
                .and()
                .httpBasic()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        return http.build();
    }
}

将产生这样的效果:home是公共的,admin是为具有ADMIN角色的用户保留的,protected是为具有ADMIN或USER角色的用户保留的。
这能解决你的问题吗?

相关问题