2012-12-12 145 views
1

我一直在尋找答案高和低。我希望能夠通過Spring Security核心插件在Grails應用程序中發送JSON數據,以驗證身份驗證。我似乎無法得到這個工作。Grails彈簧安全插件AJAX認證

我試圖測試這個使用捲曲用下面的命令:

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":"[email protected]", 
    "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":"[email protected]" 
} 

或至少每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命令時,執行結束於此。

我錯過了其他任何細節?

+0

Http stats 302意味着重定向。如果您嘗試在登錄帖子後調用「位置」中顯示的網址,會發生什麼情況?在你的例子是:http:// localhost:8080/login/authfail; jsessionid = 974763464D383CD90962E8933DBB8335?ajax = true –

回答

1

加參數-L捲曲命令應該幫助

繼在您的服務器響應部分:

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

告訴curl /瀏覽器所請求的頁面已經轉移到新的位置(登錄/ authfail )。這樣服務器將客戶端重定向到新的URL。 Web瀏覽器會立即向新位置發出請求,但默認行爲curl不會自動遵循重定向。

參數-L/- 位置指示捲曲遵循重定向。有關更多詳情,請參閱男士捲髮

+0

謝謝。這正是我錯過的!我可以看到,在cURL的幫助,但我真的不明白爲什麼這就是我所需要的。你能解釋一下那些加了什麼嗎? – ShatyUT

1

我還是想知道怎樣的要求,但我能夠通過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: '[email protected]', 
        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應用文件夾。我猜這是因爲它不是一個跨域請求。