spring-security 配置多个HttpSecurity示例时出现问题[duplicate]

pgvzfuti  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(182)

此问题在此处已有答案

Spring Security : Multiple HTTP Config not working(2个答案)
三个月前关门了。
我在配置多个httpSecurities时遇到问题。
我有一些用JWT标记保护的api路由。
我希望我的swagger-ui/index.html路由使用基本身份验证进行保护。
我希望即使在使用基本身份验证对用户进行身份验证之后,这些API路由仍然受到JWT标记的保护。
我按照此文档创建了多个SecurityFilterChain
我的问题是无论哪个FilterChain@Order(1)的作品和其他FilterChain是完全忽略。
(if filterChain具有订单1,产品和订单的路由受到保护,但swagger-ui/index.html不受基本身份验证的保护)
下面是我的实现。

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

    http
        .authenticationProvider(authenticationProvider());
    http
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    http
        .cors()
            .and()
        .csrf().disable();
    http
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api/products").hasRole("ADMIN")
            .antMatchers(HttpMethod.PUT, "/api/orders").hasRole("ADMIN")
            .antMatchers("/api/**").permitAll();
    http
        .addFilter(new JWTAuthenticationFilter(secret, authenticationManager(authConfig)));
    http
        .addFilterBefore(new JWTAuthorizationFilter(secret), UsernamePasswordAuthenticationFilter.class);

    return http.build();
}

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

    http
        .authenticationProvider(authenticationProvider());
    http
        .requestMatchers()
            .and()
        .authorizeRequests()
            .antMatchers("/swagger-ui/index.html","/v3/api-docs/","/v3/api-docs")
            .authenticated()
            .and()
        .httpBasic();

    return http.build();
}
tvmytwxo

tvmytwxo1#

您应该至少在其中一个筛选器中使用HttpSecurity的下列方法之一:
一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月一个月
这将帮助您将某些HttpSecurity配置为仅在匹配提供的模式时调用。
您已经使用了第二个过滤器中的最后一个方法,但是没有向配置器提供任何匹配器。
因此,尝试将第二个filterChain重写为:

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

    http
            .requestMatchers().antMatchers("/swagger-ui/index.html","/v3/api-docs/","/v3/api-docs")
            .and()
            .authenticationProvider(authenticationProvider())
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .httpBasic();

    return http.build();
}

还要注意的是,如果你不想在其他过滤器链中对所有其他端点的url进行硬编码,那么你的swaggerFilterChain可能会首先被调用--如果一个请求与一个过滤器匹配,那么它将是唯一要应用的过滤器,所以其他的过滤器将被忽略。
因此,您还需要更改顺序-将@Order(1)放置为您的swaggerFilterChain,并从其他过滤器链中删除此注解。

r55awzrz

r55awzrz2#

试试这个,把.antMatchers("/api/**")移到文档的开头

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

    http.authenticationProvider(authenticationProvider());
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    http.cors().and().csrf().disable();
    http.antMatchers("/api/**")
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api/products").hasRole("ADMIN")
            .antMatchers(HttpMethod.PUT, "/api/orders").hasRole("ADMIN")
            .anyRequest().permitAll();
    http.addFilter(new JWTAuthenticationFilter(secret, authenticationManager(authConfig)));
    http.addFilterBefore(new JWTAuthorizationFilter(secret), UsernamePasswordAuthenticationFilter.class);

    return http.build();
}

相关问题