Пользовательский интерфейс Polymer с API Spring Rest — проблема аутентификации

Я пытаюсь защитить доступ к некоторым REST API, используя проверку подлинности на основе форм против LDAP. Эта часть на самом деле работает нормально: - Я ввожу имя пользователя и пароль в форме, представленной на странице по умолчанию по адресу http://localhost:1304/login, а затем я могу получить доступ ко всем другим API: http://localhost:1304/user или http://localhost:1304/api/v1/search/draft.

Проблема в том, что я пытаюсь использовать такие API, как http://localhost:1304/api/v1/search/draft из внешнего интерфейса Polymer, запущенного отдельно на сервере узла на локальном хосте: 8081. Мне удалось избавиться от всех проблем с CORS, поэтому я не думаю, что дело в них. Я использую ajax-форму для публикации имени пользователя и пароля и отправки, и я вижу в журнале весеннего приложения, что аутентификация прошла успешно. Однако, когда мой пользовательский интерфейс пытается выполнить GET для этого /api/v1/search/draft API, он терпит неудачу, и вызов под капотом перенаправляется на /login (или возвращает 401, когда я использую пользовательскую аутентификациюEntryPoint). Но если я вхожу в систему, используя http://localhost:1304/login, моя страница пользовательского интерфейса может сделать API GET.

Весной у меня:

 protected void configure(HttpSecurity http) throws Exception {
    http
    .cors()
    .and()
    .authorizeRequests()
    .antMatchers("/login", "/","/src/**","/bower_components/**", "/oauth/authorize", "/oauth/confirm_access", "/logout", "/oauth/revoke-token","/oauth/check_token").permitAll()
    .anyRequest().authenticated()
    .and()
    .formLogin()
        .failureHandler(authFailureHandler)
    .permitAll()
    .and()
    .logout()                                    
    .permitAll()
    .and()
    .rememberMe()
    .and()
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
    .and()
    .exceptionHandling()
    .and()
    .csrf().disable()
    ; }

    @Bean
    CorsConfigurationSource corsConfigurationSource()
    {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:8081"));
        configuration.setAllowedMethods(Arrays.asList("HEAD", "GET","POST","OPTIONS"));
        configuration.setAllowCredentials(true);

        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
        //configuration.setAllowedHeaders(Arrays.asList("Access-Control-Allow-Credentials"));
        configuration.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

/api/v1/search/draft вызывается через iron-ajax:

<iron-ajax id="get_drafts"  handle-as="json" last-response="{{drafts}}" on-response="_onDraftsResponse" debounce-duration="900" with-credentials="true"></iron-ajax>

Для аутентификации с помощью моего полимерного пользовательского интерфейса заголовки выглядят так:

**GENERAL**
Request URL:http://localhost:1304/login
Request Method:POST
Status Code:302 
Remote Address:[::1]:1304
Referrer Policy:no-referrer-when-downgrade
**Response Headers**
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:8081
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:0
Date:Sat, 20 Jan 2018 11:43:25 GMT
Expires:0
Location:http://localhost:1304/
Pragma:no-cache
Set-Cookie:JSESSIONID=DBCAF4C1FD5D1C1655EFF873B6D556EE; Path=/; HttpOnly
Vary:Origin
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
**Request Headers**
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:ro-RO,ro;q=0.9,en-US;q=0.8,en;q=0.7
Connection:keep-alive
Content-Length:96
Content-Type:application/x-www-form-urlencoded
Host:localhost:1304
Origin:http://localhost:8081
Referer:http://localhost:8081/overview
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

последующие вызовы API к /draft с использованием другого идентификатора сеанса в заголовке запроса

Cookie:JSESSIONID=309D6615798B57247756C33808D57559

Для аутентификации с использованием формы по умолчанию/логина у меня есть:

**GENERAL**
Request URL:http://localhost:1304/login
Request Method:POST
Status Code:302 
Remote Address:[::1]:1304
Referrer Policy:no-referrer-when-downgrade
**Response Headers**
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:0
Date:Sat, 20 Jan 2018 11:47:30 GMT
Expires:0
Location:http://localhost:1304/
Pragma:no-cache
Set-Cookie:JSESSIONID=330CDE874819AA32E134A41EFB21B8E1; Path=/; HttpOnly
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
**Request Headers**

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:ro-RO,ro;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:46
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=309D6615798B57247756C33808D57559
Host:localhost:1304
Origin:http://localhost:1304
Referer:http://localhost:1304/login?logout
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

все остальные вызовы, использующие с этого момента новый

JSESSIONID=330CDE874819AA32E134A41EFB21B8E1

Я чувствую, что действительно близок к решению. Что мне не хватает? Спасибо


person vlucian    schedule 20.01.2018    source источник


Ответы (1)


Проблема была с ajax-формой, которую я использовал. Переход на простую форму решил проблему аутентификации, но теперь с localhost:8081 (где находится пользовательский интерфейс) меня перенаправляют на localhost:1304 (откуда был вызван API входа в систему). Думаю, мне нужно перейти к весеннему коду, чтобы решить эту проблему.

person vlucian    schedule 20.01.2018