Несанкционированная ошибка 401 для URL-адресов allowAll()

Я получаю несанкционированную ошибку даже для разрешения всех URL-адресов.

Это мой файл конфигурации безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Value("${auth0.audience}")
    private String audience;

    @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
    private String issuer;

    @Bean
    JwtDecoder jwtDecoder() {

        NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(issuer);

        OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience);
        OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
        OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);

        jwtDecoder.setJwtValidator(withAudience);

        return jwtDecoder;
    }

    @Bean
    public DefaultSecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         
      http
        .csrf(csrf -> csrf.disable())
        .authorizeHttpRequests(auth-> auth
            .requestMatchers("/api/public/**","/login","/register").permitAll().anyRequest().authenticated())
        .oauth2ResourceServer()
            .jwt();
        

    return http.build();    
    }
    
}

Это мой файл валидатора:

class AudienceValidator implements OAuth2TokenValidator<Jwt> {
    private final String audience;

    AudienceValidator(String audience) {
        this.audience = audience;
    }

    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        OAuth2Error error = new OAuth2Error("invalid_token", "The required audience is missing", null);
        
        if (jwt.getAudience().contains(audience)) {
            return OAuth2TokenValidatorResult.success();
        }
        return OAuth2TokenValidatorResult.failure(error);
    }
}

А это лог-файлы

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ / _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
[32m :: Spring Boot :: [39m              [2m (v3.0.1)[0;39m

[2m2023-02-19T22:23:00.142+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mc.r.apigateway.ApiGatewayApplication    [0;39m [2m:[0;39m Starting ApiGatewayApplication using Java 17.0.6 with PID 16708 (C:\PM\api-gateway - Copy\target\classes started by KrishnaGopikaUrlagan in C:\PM\api-gateway - Copy)
[2m2023-02-19T22:23:00.142+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mc.r.apigateway.ApiGatewayApplication    [0;39m [2m:[0;39m No active profile set, falling back to 1 default profile: "default"
[2m2023-02-19T22:23:00.669+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mo.s.cloud.context.scope.GenericScope    [0;39m [2m:[0;39m BeanFactory id=54aac986-e0d5-38c2-b07e-9736a12b46b1
[2m2023-02-19T22:23:01.470+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mtrationDelegate$BeanPostProcessorChecker[0;39m [2m:[0;39m Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2m2023-02-19T22:23:01.471+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mtrationDelegate$BeanPostProcessorChecker[0;39m [2m:[0;39m Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2m2023-02-19T22:23:01.471+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mtrationDelegate$BeanPostProcessorChecker[0;39m [2m:[0;39m Bean 'reactorDeferringLoadBalancerExchangeFilterFunction' of type [org.springframework.cloud.client.loadbalancer.reactive.DeferringLoadBalancerExchangeFilterFunction] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2m2023-02-19T22:23:01.538+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mswordEncoderAuthenticationManagerBuilder[0;39m [2m:[0;39m No authenticationProviders and no parentAuthenticationManager defined. Returning null.
[2m2023-02-19T22:23:02.904+05:30[0;39m [32m INFO[0;39m [35m16708[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mo.s.s.web.DefaultSecurityFilterChain    [0;39m [2m:[0;39m Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@5c9f1e10, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@9658b45, org.springframework.security.web.context.SecurityContextHolderFilter@291e1f26, org.springframework.security.web.header.HeaderWriterFilter@1d58f1b7, org.springframework.security.web.authentication.logout.LogoutFilter@2de04a13, org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter@738072a1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@240b8e76, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@2ed115b5, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2c68f8e0, org.springframework.security.web.access.ExceptionTranslationFilter@4f68b71d, org.springframework.security.web.access.intercept.AuthorizationFilter@733ad243]
[2m2023-02-19T22:23:26.660+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36mo.s.s.w.s.u.m.OrServerWebExchangeMatcher[0;39m [2m:[0;39m Trying to match using PathMatcherServerWebExchangeMatcher{pattern='/logout', method=POST}
[2m2023-02-19T22:23:26.660+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36mathPatternParserServerWebExchangeMatcher[0;39m [2m:[0;39m Request 'GET /api/public/allergy' doesn't match 'POST /logout'
[2m2023-02-19T22:23:26.660+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36mo.s.s.w.s.u.m.OrServerWebExchangeMatcher[0;39m [2m:[0;39m No matches found
[2m2023-02-19T22:23:26.661+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36ma.DelegatingReactiveAuthorizationManager[0;39m [2m:[0;39m Checking authorization on '/api/public/allergy' using org.springframework.security.authorization.AuthenticatedReactiveAuthorizationManager@69b0d355
[2m2023-02-19T22:23:26.661+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36mebSessionServerSecurityContextRepository[0;39m [2m:[0;39m No SecurityContext found in WebSession: 'org.springframework.web.server.session.InMemoryWebSessionStore$InMemoryWebSession@2da15e91'
[2m2023-02-19T22:23:26.661+05:30[0;39m [32mDEBUG[0;39m [35m16708[0;39m [2m---[0;39m [2m[     parallel-1][0;39m [36mo.s.s.w.s.a.AuthorizationWebFilter      [0;39m [2m:[0;39m Authorization failed: Access Denied

Это файл 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.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>api-gateway-auth0</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>api-gateway</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2022.0.1</spring-cloud.version>
    </properties>
      <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <id>netflix-candidates</id>
      <name>Netflix Candidates</name>
      <url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

</project>

Я попытался разрешить все общедоступные URL-адреса и аутентифицировать все частные URL-адреса. но даже если я разрешил общедоступные URL-адреса, я получаю ошибку 401. Я убрал зависимость от webflux, добавил аннотацию @Configuration и внес еще несколько изменений на основе предложений, которые я получил из комментариев. Но все равно такая же проблема.

Пожалуйста, помогите мне решить эту ошибку.

@KrishnaGopikaUrlaganti Вы хотите использовать Webflux или Servlet? Вы должны использовать разные конфигурации безопасности для Webflux или Servlet. Также вы должны использовать подстановочные знаки в своем сопоставителе, чтобы соответствовать вызываемому URL-адресу. А второй .authorizeHttpRequests() надо убрать. Это не имеет никакого смысла. Если вы получаете 401, вы не вошли в систему. Проверьте свой JWT. В Spring Boot 3 вы должны добавить @Configuration в свой класс.

dur 18.02.2023 11:52

Могут быть еще какие-то проблемы, мы их не видим. Например: ваш класс находится в правильном пакете?

dur 18.02.2023 12:01

@SteveRiesenberg, вы были правы, я по ошибке добавил зависимость от Webfluc, удалил ее сейчас, а также внес некоторые предложенные изменения. Я все еще получаю несанкционированный 401 для URL-адресов /api/public/.

Krishna Gopika Urlaganti 19.02.2023 17:04

не могли бы вы обновить свой пост новыми журналами после ваших изменений

Toerktumlare 19.02.2023 19:36

Журналы показывают, что вы все еще используете Spring WebFlux. В вашем pom.xml вы зависите от spring-boot-starter-gateway, который работает только с Spring WebFlux. Поэтому, как уже упоминалось @dur, ваш SecurityConfig неверен. См. Явная конфигурация безопасности WebFlux. Я обновил свой ответ.

Steve Riesenberg 20.02.2023 04:32

Большое спасибо, @SteveRiesenberg. Я исправил проблему, используя @EnableWebFluxSecurity вместо @EnableWebSecurity и добавив SecurityWebFilterChain.

Krishna Gopika Urlaganti 20.02.2023 20:31

Большое спасибо @dur, я исправил проблему, используя @EnableWebFluxSecurity вместо @EnableWebSecurity и добавив SecurityWebFilterChain.

Krishna Gopika Urlaganti 20.02.2023 20:33

Если мой ответ действительно ответил на ваш вопрос, не могли бы вы его принять? Спасибо.

Steve Riesenberg 21.02.2023 22:42
0
8
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Spring Security 6 по умолчанию запрещает доступ, поэтому, если вы явно не укажете URL-адрес или не предоставите подстановочный знак, доступ будет запрещен. Попробуй это:

.requestMatchers("api/public/**").permitAll())

Вместо этого вы можете попробовать /api/public/**.

Matt Raible 17.02.2023 16:14

Я пытался, но это не сработало

Krishna Gopika Urlaganti 17.02.2023 23:17

Ссылка, которую вы предоставляете, является конкретной. Вам необходимо предоставить общий для весенней безопасности, чтобы либо принять, либо отклонить API, принадлежащие этому пути. Попробуйте следующее: instead of "api/public" or api/private use "api/public/*" and "api/private/*"

Ответ принят как подходящий

Если вы используете Spring Security 6.x, возможно, вам не хватает @Configuration на вашем SecurityConfig. Я добавил комментарий, объясняющий несоответствие между вашими журналами и вашей конфигурацией, поэтому, если отсутствующая аннотация является вашей проблемой, впоследствии вы можете столкнуться с дополнительными проблемами конфигурации.

См. руководство по миграции 5.8 (которое следует использовать при обновлении до 6.0) для получения дополнительной информации.


Редактировать:

При дальнейшем обсуждении в комментариях и просмотре вашего обновленного вопроса выясняется, что вы создаете приложение с использованием spring-boot-starter-gateway (Spring Cloud Gateway), которое основано на Spring WebFlux и требует соответствующей настройки безопасности с использованием @EnableWebFluxSecurity. Явная конфигурация безопасности WebFlux в справке содержит пример конфигурации, чтобы вы могли начать работу с Spring WebFlux.

Большое спасибо, я исправил проблему, используя @EnableWebFluxSecurity вместо @EnableWebSecurity и добавив SecurityWebFilterChain.

Krishna Gopika Urlaganti 20.02.2023 20:33

Другие вопросы по теме