如何使用CURL登录spring security登录表单?
我正在开发一个springMVC项目,其中用户身份validation基于spring安全性。
我们的想法是让移动(android)应用程序能够向后端发送某种数据。
所以在让我的手弄脏到android开发之前我决定使用CURL来模拟登录表单的情况。
我们网站的登录表格如下:
http://localhost:8080/app/user/login
我使用以下命令:
curl -F 'username=admin&password=admin' http://localhost:8080/app/user/login
但是我会得到登录页面,换句话说我无法根据模拟情况传递用户身份validation。
请注意:对于每个请求,spring secure将创建一个类似于以下内容的随机化令牌:
8863F732ADDE24CD167F4EF502A4333D
我应该如何使用模拟情境( CURL
或HTTPClient
)基于spring security传递登录表单
像这样使用cURL
:
curl -d j_username=admin -d j_password=admin -L http://localhost:8080/app/j_spring_security_check
CSRF
如果您Expected CSRF token not found. Has your session expired?
Expected CSRF token not found. Has your session expired?
这意味着启用了CSRF令牌保护。 要使用cURL对其进行测试,您需要一个cookie和一个CSRF令牌本身。
以下命令将所有cookie写入名为cookie
的文件并打印出CSRF令牌。 Spring Security默认令牌参数名称为_csrf
,如果您已更改它,则还需要更改grep csrf
。
curl --cookie-jar cookie -L http://localhost:8080/app/j_spring_security_check | grep csrf
然后,您可以执行下一个命令,该命令将从文件传递所有cookie。 不要忘记替换|your_token_value|
具有由前一个命令打印出的实际值(如果已更改, _csrf
参数名称)。
curl --cookie cookie -d "j_username=admin&j_password=admin&_csrf=|your_token_value|" -L http://localhost:8080/app/j_spring_security_check
从Spring Security 3.x到4.x.
请注意,在Spring Security 4.x中, login-processing-url
默认值从/j_spring_security_check
更改为POST /login
, username-parameter
默认值从j_username
更改为username
, password-parameter
默认值从j_password
更改为password
。 如果应用程序显式提供这些属性,则迁移不需要任何操作。
您应该配置spring以支持基本身份validation。 然后在您的请求中添加以下标头:
- 名称:
Authorization
- value:
base64(username:password)
这意味着用户名和密码应该与一个字符串一起使用:
作为分隔符,然后使用BASE64
转换进行转换。
基于最多的投票答案,我写了以下脚本:
#!/usr/bin/env bash curl --cookie-jar cookie -L http://localhost:PORT/secureDomain/secureURL TOKEN=$( cat cookie | grep 'XSRF' | cut -f7 ) curl --cookie cookie -u admin:admin -d "_csrf=$TOKEN" -L http://localhost:PORT/secureDomain/secureURL
适用于Spring Security 4。
如果启用了CSRF,则需要从每个请求的输出中捕获令牌值,以便在下一个请求中使用它。
BASEURL="http://localhost:8080/hac" csrf=$(curl --silent --cookie-jar cookies.txt -L "$BASEURL/login.jsp" | egrep -o -m1 "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}") csrf=$(curl --silent --cookie cookies.txt --cookie-jar cookies.txt -L "$BASEURL/j_spring_security_check" --data "j_username=$USERNAME&j_password=$PASSWORD&_csrf=$csrf" | egrep -o -m1 "[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}" )
您可以用这种方式串起更多命令,每次都更新$csrf
的值。
这适用于Spring security 3。
仅仅使用-d选项对我来说还不够。 我们的Web应用程序由Tomcat托管,位于webapps / ROOT文件夹中,具有以下配置:
以下工作将POST请求发送到我们的Web应用程序(假设Tomcat正在侦听端口8080):
curl -i -H "Content-Type: application/x-www-form-urlencoded" -c cookies.txt -H "Origin: http://localhost:8080/" -d "j_username=USERNAME&j_password=PASSWORD" -X POST http://localhost:8080/j_spring_security_check curl -i -d @JSON_FILE -H "Content-Type: application/json" -H "Origin: http://localhost:8080/" -b cookies.txt -X POST http://localhost:8080/URL
用您自己的USERNAME,PASSWORD,JSON_FILE和URL替换。