23

我正在开发一个 springMVC 项目,其中用户身份验证基于 spring 安全性。

这个想法是有一个移动(android)应用程序能够向后端发送某种数据。

因此,在着手进行 android 开发之前,我决定使用 cURL 模拟登录表单的情况。

我们网站的登录表格如下:

http://localhost:8080/app/user/login

我使用以下命令:

curl -F 'username=admin&password=admin' http://localhost:8080/app/user/login

但是我将获得登录页面,换句话说,我无法根据模拟情况通过用户身份验证。

只是要注意:对于每个请求,spring secure 将创建一个类似于以下内容的随机化令牌:

8863F732ADDE24CD167F4EF502A4333D

cURL我应该如何使用模拟情况(或HTTPClient)基于spring security传递登录表单

4

6 回答 6

25

像这样使用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?意味着 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-parameterj_passwordpassword

于 2012-10-24T13:31:31.520 回答
3

您应该配置 spring 以支持基本身份验证。然后将以下标头添加到您的请求中:

  • 姓名:Authorization
  • 价值:base64(username:password)

这意味着用户名和密码应该以:分隔符连接成一个字符串,然后使用转换进行BASE64转换。

于 2012-10-24T12:17:42.190 回答
3

根据投票最多的答案,我编写了以下脚本:

#!/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。

于 2016-06-20T19:03:16.853 回答
1

该脚本适用于 Spring Boot 2.1.6 和 Spring Security 5.1.5:

# Obtain the CSRF token _plus_ the JSESSIONID cookie to go along with it.
export CSRF_TOKEN=$(curl -s -c cookies.txt -L http://localhost:8080/login | \
  grep -Eo "name=\"_csrf\" value=\"[0-9a-z-]+\"" | cut -d= -f3 | tr -d '"')

echo "Found csrf token: $CSRF_TOKEN"

# Login with the username and password, reading from (-b) and updating (-c) the cookie jar file.
curl -s -c cookies.txt -b cookies.txt -X POST \
     -F "username=admin" -F "password=password" -F "_csrf=$CSRF_TOKEN" http://localhost:8080/login

SESSION_ID=$(grep "JSESSIONID" cookies.txt | cut -f 7)
echo "Got session token: $SESSION_ID"

# Finally, execute authorized API action
curl -sL -b cookies.txt "http://localhost:8080/authorized/url"
于 2019-06-25T03:44:40.750 回答
1

如果启用了 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。

于 2017-06-27T20:47:55.753 回答
0

仅使用 -d 选项对我来说是不够的。我们的 Web 应用程序由 Tomcat 托管,位于 webapps/ROOT 文件夹中,并具有以下配置:

<form-login login-page="/login.jsp"
    authentication-success-handler-ref="appAuthenticationSuccessHandler"
    authentication-failure-handler-ref="appAuthenticationFailureHandler"
    username-parameter="j_username" 
    password-parameter="j_password" 
    login-processing-url="/j_spring_security_check"/>

<csrf disabled="true"/>

<headers>
    <frame-options policy="SAMEORIGIN"/>
</headers>

下面的工作将 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 替换为您自己的。

于 2018-03-06T09:06:34.223 回答