如何使用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

我应该如何使用模拟情境( CURLHTTPClient )基于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 /loginusername-parameter默认值从j_username更改为usernamepassword-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替换。