私のアプリでは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つずつ指定する必要はありません。
私はそれが正しいと思っていますか?
おかげで、
これは、次のとおりです。http://grails.github.io/grails-doc/3.0.9/guide/theWebLayer.html#interceptorsフィルタはGrails 3で廃止されました。また、myインターセプターとあなたが提案したフィルターがあります。それはまだ動作すると思われます。 –
通常のgrailsフィルタではないサーブレットフィルタです。おそらくこれがあなたの実装と比較して働いている理由です。私は傍受者の内部をよく知らない。 –