我一直在寻找这个问题的答案。我希望能够在Grails应用程序中使用将验证身份验证的spring安全核心插件发送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']
]
我已经将GormUserDetailsService子类化并重写了loadUserByUsername来执行我自己的查找,但传入的用户名是空白的...空字符串。我知道这是因为我能够在该方法中设置一个断点,当我发送我的cURL命令时,执行操作就会结束。
我缺少其他任何细节?
答案 0 :(得分: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文件夹中。我猜这是因为它不是跨域请求。
答案 1 :(得分:1)
将参数-L添加到curl命令应该有帮助
参与服务器响应:
HTTP/1.1 302 Moved Temporarily
Location: http://localhost:8080/login/authfail;jsessionid=974763464D383CD90962E8933DBB8335?ajax=true
告诉curl /浏览器所请求的页面已移至新位置( login / authfail )。这样,服务器将客户端重定向到新URL。 网络浏览器会立即向新位置发出请求,但 curl 的默认行为不会自动跟踪重定向。
参数 -L / - location 指示curl遵循重定向。有关详细信息,请参阅 man curl 。