2016-10-24 1 views
1

私はStormpathとSpring Bootを使って最初のアプリケーションを構築しようとしています。 StormpathサーブレットにCORSフィルタを追加する方法が見つかりません。その結果、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フィルタが必要だと思いますか?あなたが達成しようとしていることとあなたが目にしている問題は何ですか?ところで、私たちは現在、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

スプリングブートはCross-Origin Resource Sharing (CORS)をサポートしますが、Spring Securityではなく、Spring MVCでのみ動作します。 Spring FrameworkはCorsFilter you can use for filter-based frameworksを提供します。すでにFilterRegistrationBeanでこれをやっているようです。

先週同じ問題が発生しましたが、writing a blog post about itです。デバッグの後、メインStormpathFilterCorsFilterの前に来るので、これがわかりました。

これを修正するには、application.propertiesに以下を追加します。

+0

ありがとう、それが問題を解決しました。 –

2

バージョン1.2.0から、Stormpath Java SDKは、そのままの状態でCORSフィルタを提供します。これらのプロパティは、あなたのapplication.propertiesファイルを経由して、カスタマイズされます

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 

:次のオプションとデフォルトで有効になります。