2016-10-24 2 views
1

Я пытаюсь создать свое первое приложение, используя Stormpath и Spring Boot. Я не могу найти, как добавить фильтр CORS в сервлет Stormpath. В результате мое приложение переднего конца не может получить токен аутентификации, потому что заголовок Access-Control-Allow-Origin отсутствует.CorsFilter with Stormpath

С журналами я уверен, что мой фильтр CORS вызывается методами, которые я управляю, но не по запросу/oauth/token.

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class SimpleCorsFilter implements Filter { 

    private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class); 

    public SimpleCorsFilter() { 
     log.info("SimpleCORSFilter init"); 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
      throws IOException, ServletException { 

     log.debug("*********Enter Cors Filter***********"); 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); 

     chain.doFilter(req, res); 
     log.debug("******* Exit Cors Filter ****"); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) { 
    } 

    @Override 
    public void destroy() { 
    } 

} 

Я также попробовал подход в этом блоге https://shuaib.me/stormpath-java-backend/ и добавлены следующие строки в application.properties.

stormpath.web.accessToken.origin.authorizer.originUris = http://localhost:3002 
stormpath.web.filters.cors = something.SimpleCorsFilter 
stormpath.web.uris./logout = cors 
stormpath.web.uris./register = cors 
stormpath.web.uris./oauth/token = cors 

Я также попытался добавить FilterRegistrationBean

@Bean 
public FilterRegistrationBean corsFilter() { 
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
    CorsConfiguration config = new CorsConfiguration(); 
    config.setAllowCredentials(true); 
    config.addAllowedOrigin("http://localhost"); 
    config.addAllowedHeader("*"); 
    config.addAllowedMethod("*"); 
    source.registerCorsConfiguration("/**", config); 
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
    bean.setOrder(0); 
    return bean; 
} 

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

Наконец, это мой ПОМ

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>stormpath-basic</groupId> 
<artifactId>stormpath-basic</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.1.RELEASE</version> 
    <relativePath /> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
    <stormpath.version>1.1.1</stormpath.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>com.stormpath.spring</groupId> 
     <artifactId>stormpath-default-spring-boot-starter</artifactId> 
     <version>${stormpath.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </dependency> 


    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.16.10</version> 
    </dependency> 

    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.jayway.jsonpath</groupId> 
     <artifactId>json-path</artifactId> 
    </dependency> 


    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
    </dependency> 

</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

ли я что-то отсутствует?

+0

Почему, по-вашему, вам нужен фильтр CORS для получения токена аутентификации? Можете ли вы описать, что вы пытаетесь достичь, и в чем проблема, которую вы видите? BTW, мы в настоящее время работаем над добавлением фильтра CORs в наш стек. Вы можете увидеть здесь существующий код, если вы хотите скопировать то, что там делается: https://github.com/stormpath/stormpath-sdk-java/pull/1001 – mario

+0

Мой передний конец в Angular не работает в тот же url, что и мой микросервис. Я запускаю штормовой путь в моем служении. Когда мой внешний интерфейс запрашивает токен для [myserviceurl]/oauth/token, токен отклоняется, потому что он пропускает заголовки CORS. –

+0

Вам нужно только добавить начало в 'stormpath.web.oauth2.origin.authorizer.originUris ='. Для этого не требуется фильтр CORS. См. Здесь: https://docs.stormpath.com/java/servlet-plugin/appendix/web-stormpath-properties.html – mario

ответ

1

Spring Boot поддерживает Cross-Origin Resource Sharing (CORS), но он работает только для Spring MVC, а не для Spring Security. Spring Framework предоставляет CorsFilter you can use for filter-based frameworks. Похоже, вы уже делаете это со своим FilterRegistrationBean.

Я столкнулся с этой же проблемой на прошлой неделе, пока writing a blog post about it. После отладки я понял, что это связано с тем, что основной StormpathFilter предшествует CorsFilter.

Чтобы исправить это, добавьте следующее к application.properties.

stormpath.web.stormpathFilter.order=1 
+0

Спасибо, что решила проблему. –

2

Начиная с версии 1.2.0, SDK Stormpath Java предоставит фильтр CORS из коробки. Он будет включен по умолчанию со следующими параметрами:

stormpath.web.cors.enabled = true 
#Comma separated list of allowed origins 
stormpath.web.cors.allowed.originUris = 
stormpath.web.cors.allowed.headers = Content-Type,Accept,X-Requested-With,remember-me 
stormpath.web.cors.allowed.methods = POST,GET,OPTIONS,DELETE 

Этих свойства будут настраиваемыми с помощью файла application.properties.

Смежные вопросы