Spring Security 使用addFilterAfter的PermitAll不起作用

iszxjhcz  于 2023-01-20  发布在  Spring
关注(0)|答案(1)|浏览(353)

正在努力使用新的Spring Security 6.x。具有以下SecuritsFilterChain

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfiguration {

    public SecurityConfiguration() {}

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

        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/swagger-ui/**", "/swagger-ui/index.html**", "/swagger-ui/index.html/**", "/v3/api-docs/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .addFilterAfter(new JWTAuthorizationFilter(), BasicAuthenticationFilter.class));

    return http.build();
}

很遗憾,URL:

/swagger-ui/index.html

执行不应该执行的过滤器JWTAuthorizationFilter。没有过滤器,它可以工作。

kcwpcxri

kcwpcxri1#

首先,请允许我为可读性提出一些修改建议,然后我将在此之后进行评论:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((authorize) -> authorize
            .requestMatchers(...).permitAll()
            .anyRequest().authenticated()
        )
        .addFilterAfter(new JWTAuthorizationFilter(), BasicAuthenticationFilter.class)

    return http.build();
}

这样做的好处是,将授权规则与正在配置的其余过滤器分开查看会更容易一些。

允许全部

每个请求都调用身份验证筛选器。
permitAll()authenticated()hasRole()都与AuthorizationFilter一起工作,AuthorizationFilter被放置在过滤器链中的认证过滤器之后。
这意味着JWTAuthorizationFilterBasicAuthenticationFilter和所有身份验证过滤器不受您添加的任何授权规则的影响。
如果存在JWTAuthorizationFilter应该跳过的某些请求,则由该过滤器来决定。

相关问题