2016-04-04 9 views
2

私のアプリではgrails-spring-security-restプラグインを使用しています現在認証フローを構築しています。405/api/loginでメソッドが許可されていないgrails-spring-security-restプラグインでOPTIONSリクエストを受け取りました(そして、戦い続けます...)

残りのクライアントを使用すると、すべて正常に動作します。ユーザー名&をjsonに投稿してトークンを取得してログインすることができます。完璧!

ここでは、このすべてをWebフォームと統合しようとしています。もちろん、ブラウザはプリフライトOPTIONSリクエストを送信します。

@GrailsCompileStatic 
class CorsInterceptor { 
    int order = HIGHEST_PRECEDENCE 

    CorsInterceptor() { 
     matchAll() // match all controllers 
     //.excludes(controller:"login") // uncomment to add exclusion 
    } 

    boolean before() { 
     String origin = request.getHeader("Origin"); 

     boolean options = "OPTIONS".equals(request.getMethod()); 
     if (options) { 
      if (origin == null) return; 
      response.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with"); 
      response.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS"); 
      response.addHeader("Access-Control-Max-Age", "3600"); 
     } 

     response.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin); 
     response.addHeader("Access-Control-Allow-Credentials", "true"); 

     true // proceed to controller 
    } 

    boolean after() { true } 

    void afterView() { 
     // no-op 
    } 

} 

インターセプタは完全に有効なGETリクエストを持って、レスポンスにヘッダを追加した作品:

私は、単純なインターセプタを設定しています。しかし、私はこのsenfにしようとしています:

curl -X "OPTIONS" "http://localhost:8080/api/login" \ 
    -H "Origin: http://localhost:3000" \ 
    -H "Content-Type: application/json" \ 
    -d "{\"username\":\"customer\",\"password\":\"password\"}" 

私はいつも405 Method Not Allowedバックを取得していますし、実行は、まったくインターセプタすることになっていません。

私の前提は、プラグインによって提供されるログインコントローラがそれを許可していないということです。この問題を克服するために追加のURLマッピングを配置する必要があります。私の問題は、このマッピングがどのように見えるのか?

また、OPTIONSのすべての要求に対して機能するマッピングを設定することができるため、1つずつ指定する必要はありません。

私はそれが正しいと思っていますか?

おかげで、

答えて

5

この問題は、他の多くのユーザーが直面して繰り返しgithubのスラックチャンネルに頼まれました。私は、src /ディレクトリの下にCORSフィルタを持つサンプルサンプルを作成しました。これをSpring Beanとして登録しました。 Here is github repo with example app。このプラグインのGitHubのレポに尋ね

beans = { 
    corsFilter(CorsFilter) 
} 

Here is質問:CORSフィルタコードが

@Priority(Integer.MIN_VALUE) 
class CorsFilter extends OncePerRequestFilter { 
@Override 
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) 
     throws ServletException, IOException { 

    String origin = req.getHeader("Origin"); 

    boolean options = "OPTIONS".equals(req.getMethod()); 
    if (options) { 
     if (origin == null) return; 
     resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with"); 
     resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS"); 
     resp.addHeader("Access-Control-Max-Age", "3600"); 
    } 

    resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin); 
    resp.addHeader("Access-Control-Allow-Credentials", "true"); 

    if (!options) chain.doFilter(req, resp); 
} 
} 

登録の下に、以下のようにresources.groovyファイルで、この春のようにBeanです。

更新 Grails3 CORS interceptor pluginは、SpringSecurityCorsFilterを含むように更新されました。使用方法の詳細については、this sample

を参照してください。このプラグインは、上記のサーブレットフィルタよりもはるかに優れています。

+0

これは、次のとおりです。http://grails.github.io/grails-doc/3.0.9/guide/theWebLayer.html#interceptorsフィルタはGrails 3で廃止されました。また、myインターセプターとあなたが提案したフィルターがあります。それはまだ動作すると思われます。 –

+1

通常のgrailsフィルタではないサーブレットフィルタです。おそらくこれがあなたの実装と比較して働いている理由です。私は傍受者の内部をよく知らない。 –

関連する問題