1

私はこれに対する答えを高低で探してきました。認証を検証するスプリング セキュリティ コア プラグインを使用して、Grails アプリケーションで JSON データを送信できるようにしたいと考えています。私はこれを機能させることができないようです。

次のコマンドで cURL を使用してこれをテストしようとしています。

curl -v -H "Content-Type: application/json" -X POST --data @ajax_login.json http://localhost:8080/j_spring_security_check?ajax=true

私の ajax_login.json は次のようになります。

{
    "j_username":"user@email.com",
    "j_password":"password"
}

私の応答は次のようになります。

* About to connect() to localhost port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /j_spring_security_check?ajax=true HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 63
> 
< HTTP/1.1 302 Moved Temporarily
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=974763464D383CD90962E8933DBB8335; Path=/
< Set-Cookie: grails_remember_me=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
< Location: http://localhost:8080/login/authfail;jsessionid=974763464D383CD90962E8933DBB8335?ajax=true
< Content-Length: 0
< Date: Wed, 12 Dec 2012 22:53:27 GMT
< 
* Connection #0 to host localhost left intact
* Closing connection #0

私は、LoginController の ajaxSuccess アクションに従って、次のようなものを見たいと思っていました:

{
    "success":true,
    "username":"user@email.com"
}

または、少なくとも LoginController の ajaxfail アクションごとの失敗 JSON:

{
    "error":"#yourdoingitwrong"
}

参考までに、私の config.groovy には次のものがあります。

grails.plugins.springsecurity.interceptUrlMap = [
  '/css/**':    ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/common.css':  ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/favicon.ico': ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/js/**':   ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/login/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/logout/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/register/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/error/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'],
  '/**':      ['IS_AUTHENTICATED_REMEMBERED']
]

GormUserDetailsS​​ervice をサブクラス化し、loadUserByUsername をオーバーライドして独自のルックアップを行いましたが、渡されたユーザー名は空白です...空の文字列です。そのメソッドにブレークポイントを設定でき、cURL コマンドを送信すると実行がそこで終了するため、これを知っています。

私が見逃している他の詳細はありますか?

4

2 に答える 2

1

パラメーター -L を curl コマンドに追加すると役立つはずです

サーバー応答の次の部分:

HTTP/1.1 302 Moved Temporarily 
Location: http://localhost:8080/login/authfail;jsessionid=974763464D383CD90962E8933DBB8335?ajax=true

要求されたページが新しい場所に移動したことを curl/browser に伝えます ( login/authfail )。このようにして、サーバーはクライアントを新しい URL にリダイレクトします。Web ブラウザはすぐに新しい場所にリクエストを発行しますが、curlのデフォルトの動作はリダイレクトを自動的にはたどりません。

パラメータ-L/--locationは、curl にリダイレクトに従うように指示します。詳しくはマンカールをご覧ください。

于 2012-12-13T06:23:58.673 に答える
1

要求どおりに cURL コマンドを発行する方法を知りたいのですが、jQuery.ajax 経由で正常に通信できました。

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript">
    $(function() {
        $('#btnPush').on('click', function() {
            $.ajax({
                url: 'http://localhost:8080/j_spring_security_check',
                type: 'POST',
                data: {
                    j_username: 'user@email.com',
                    j_password: 'password'
                },
                success: function(data, textStatus, jqXHR) {
                    alert('Success!!!');
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    alert('Fail!');
                }
            });
        });
    });
    </script>
</head>
<body>
<button id='btnPush'>Push Me!</button>
</body>
</html>

この HTML ファイルは、Grails アプリケーションの web-app フォルダーに含める必要がありました。クロスドメインリクエストではないためだと思います。

于 2012-12-13T04:48:33.327 に答える