Я включаю CORS в конфигурации веб-безопасности:
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers( "/forms/**").permitAll()
.antMatchers( "/member/login").permitAll()
.antMatchers( "/member/signup").permitAll()
.anyRequest().authenticated()
.and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/member/logout")).logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)))
.and().requestCache().requestCache(new NullRequestCache());
}
@Bean
public JsonUsernamePasswordAuthenticationFilter authenticationFilter() throws Exception {
JsonUsernamePasswordAuthenticationFilter authenticationFilter = new JsonUsernamePasswordAuthenticationFilter();
authenticationFilter.setAuthenticationSuccessHandler(authenticationSuccessHandler());
authenticationFilter.setAuthenticationFailureHandler(authenticationFailureHandler());
authenticationFilter.setAuthenticationManager(authenticationManagerBean());
authenticationFilter.setFilterProcessesUrl("/member/login");
authenticationFilter.setPasswordParameter("password");
authenticationFilter.setUsernameParameter("email");
authenticationFilter.setPostOnly(true);
return authenticationFilter;
}
}
И JsonUsernamePasswordAuthenticationFilter
:
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if(CorsUtils.isPreFlightRequest(request) || request.getMethod().equals(HttpMethod.OPTIONS.name())) response.setHeader("Allow", HttpMethod.POST.name());
if (this.postOnly && !request.getMethod().equals("POST")) {
return null;
} else {
MemberLogin login = getAuthenticationRequest(request);
if (login.getEmail() == null) login.setEmail("");
if (login.getPassword() == null) login.setPassword("");
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(login.getEmail(), login.getPassword());
setDetails(request, token);
return getAuthenticationManager().authenticate(token);
}
}
Когда я запускаю свой проект с ionic cordova emulate -l -c ios
в симуляторе, мой POST
запросов на /members/login
(фильтр проверки подлинности) завершаются неудачно со следующей ошибкой, тогда как POST
запросы на /members/signup
(конечная точка контроллера) выполняются успешно:
{"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0,"statusText":"Unknown Error","url":null,"ok":false,"name":"HttpErrorResponse","message":"Http failure response for (unknown url): 0 Unknown Error","error":{"isTrusted":true}}
И ошибка от Web Inspectorследующим образом:
[Error] Origin http://172.20.10.2:8100 is not allowed by Access-Control-Allow-Origin.
[Error] XMLHttpRequest cannot load http://172.20.10.2:8080/member/login due to access control checks.
[Error] Failed to load resource: Origin http://172.20.10.2:8100 is not allowed by Access-Control-Allow-Origin. (login, line 0)
Заголовки для ответа на запрос OPTIONS
следующие:
Allow →POST
X-Content-Type-Options →nosniff
X-XSS-Protection →1; mode=block
Cache-Control →no-cache, no-store, max-age=0, must-revalidate
Pragma →no-cache
Expires →0
X-Frame-Options →DENY
Content-Length →0
Date →Fri, 05 Apr 2019 11:53:58 GMT
и заголовки для ответа на запрос POST
:
X-Content-Type-Options →nosniff
X-XSS-Protection →1; mode=block
Cache-Control →no-cache, no-store, max-age=0, must-revalidate
Pragma →no-cache
Expires →0
X-Frame-Options →DENY
Access-Control-Expose-Headers →*
Access-Control-Allow-Origin →*
x-auth-token →b5f39afe-ad54-40b1-a690-0c79f800abd6
Content-Length →0
Date →Fri, 05 Apr 2019 12:08:30 GMT
, которые идентичны заголовкам для запросов к /member/signup
.
В этом говорится, что --livereload
все еще вызывает веб-сервер с запросами, имеющими происхождение, поэтомуМожно столкнуться с проблемами CORS, но событие, когда я запускаю без него (на самом деле упаковываю приложение и распространяю в моей организации), мои запросы все равно не выполняются (с ionic cordova build ios
и из проекта XCode).
Так что мои вопросы:
- Почему мой запрос не выполняется, даже когда я упаковываюприложение и распространять без livereload (разве источник моих запросов не должен быть пустым?)
- Как включить CORS для моего фильтра аутентификации?
Ссылки:
Здесь относится к ионному прокси.Я не могу использовать прокси в производстве.Я хотел бы знать, как я могу включить CORS, и на самом деле, почему это происходит в первую очередь без происхождения на устройстве.
Это не делаетt, я сталкиваюсь с той же проблемой.
Этот тоже не помогает.