Spring Boot и JWT - JSESSIONID позволяет запрос REST без необходимости JWT? - PullRequest
0 голосов
/ 28 апреля 2020

Я реализовал JWT авторизацию в моем Spring Boot REST API с использованием Auth0.

Обычно это работает, как и ожидалось, однако я заметил странную проблему при тестировании в POSTMAN.

Когда я успешно аутентифицирую любой запрос, например, запрос GET с использованием токена Bearer JWT из Auth0, я получаю следующий Cookie, заполненный во всех моих других запросах:

enter image description here

Теперь, с этим JESSIONID поваром ie, я могу выполнять другие мои REST запросы с без JWT Token ?

Почему это? Это не кажется безопасным, я ожидаю, что JWT нужно будет передавать для каждого запроса REST?

My Spring SecurityConfig для справки:

/**
 * Configures our application with Spring Security to restrict access to our API endpoints.
 */
@EnableWebSecurity

    public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

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

        @Override
        public void configure(HttpSecurity http) throws Exception {
            /*
            This is where we configure the security required for our endpoints and setup our app to serve as
            an OAuth2 Resource Server, using JWT validation.
            */
            http.cors().and().csrf().disable().authorizeRequests()
                .mvcMatchers(HttpMethod.GET,"/users/**").authenticated()
                .mvcMatchers(HttpMethod.POST,"/users/**").authenticated()
                .mvcMatchers(HttpMethod.DELETE,"/users/**").authenticated()
                .mvcMatchers(HttpMethod.PUT,"/users/**").authenticated()
                .and()
                .oauth2ResourceServer().jwt();
        }

        @Bean
        JwtDecoder jwtDecoder() {
            /*
            By default, Spring Security does not validate the "aud" claim of the token, to ensure that this token is
            indeed intended for our app. Adding our own validator is easy to do:
            */

            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
        CorsConfigurationSource corsConfigurationSource() {
            CorsConfiguration configuration = new CorsConfiguration();
            configuration.setAllowedOrigins(Arrays.asList("*"));
            configuration.setAllowedMethods(Arrays.asList("*"));
            configuration.setAllowedHeaders(Arrays.asList("*"));
            configuration.setAllowCredentials(true);
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", configuration);
            return source;
        }
    }

1 Ответ

1 голос
/ 28 апреля 2020

Существует 4 способа управления сеансом в Spring Security,

  1. всегда - сеанс всегда будет создаваться, если он еще не существует
  2. ifRequired - сеанс будет создается только при необходимости (по умолчанию)
  3. никогда - платформа никогда не создаст сам сеанс, но будет использовать его, если он уже существует
  4. без состояния - сеанс не будет создан или использован Spring Security

Итак, глядя на вашу конфигурацию, кажется, что ваше приложение использует 2-й параметр, который называется "ifRequired", и создает сеанс, а если запрос приходит с существующим идентификатором сеанса, он позволяет пользователю получить доступ к ресурсу. потому что этот пользователь уже авторизован.

Итак, если вы хотите, чтобы ваше приложение было полностью без сохранения состояния, и не нужно создавать сеанс, вам следует использовать последний параметр, который не содержит состояний. Поэтому, чтобы сделать его без сохранения состояния, измените свою конфигурацию на

http.cors().and().csrf().disable().sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
        .mvcMatchers(HttpMethod.GET, "/users/**").authenticated()
        .mvcMatchers(HttpMethod.POST, "/users/**").authenticated()
        .mvcMatchers(HttpMethod.DELETE, "/users/**").authenticated()
        .mvcMatchers(HttpMethod.PUT, "/users/**").authenticated().and().oauth2ResourceServer()
        .jwt();

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...