Я пытаюсь защитить доступ к некоторым 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
Я чувствую, что действительно близок к решению. Что мне не хватает? Спасибо