我正在开发一个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将创建一个类似于以下内容的随机令牌:
8863 F-4 F-16 F-4 F-20 F 4333 d
我应该如何使用模拟情况(CURL
或HTTPClient
)基于弹簧安全性传递登录表单
像这样使用cURL
:
curl -d j_username=admin -d j_password=admin -L http://localhost:8080/app/j_spring_security_check
如果你得到像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
)。
login-processing-url
请注意,在Spring Security 4.x中,/j_spring_security_check
的默认值从/login
更改为POST username-parameter
,j_username
的默认值从username
更改为password-parameter
,j_password
的默认值从password
更改为Authorization
。如果应用程序显式提供这些属性,则迁移不需要任何操作。
您应该配置spring以支持基本身份验证。然后在您的请求中添加以下标头:
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
转换进行转换。
基于最多投票的答案,我写了以下脚本:
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}" )
适用于Spring Security 4。
如果启用了CSRF,则需要从每个请求的输出中捕获令牌值,以便在下一个请求中使用它。
$csrf
您可以用这种方式串起更多命令,每次都更新<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>
的值。
这适用于Spring security 3。
仅仅使用-d选项对我来说还不够。我们的Web应用程序由Tomcat托管,位于webapps / ROOT文件夹中,具有以下配置:
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
以下工作将POST请求发送到我们的Web应用程序(假设Tomcat正在侦听端口8080):
qazxswpoi
用您自己的USERNAME,PASSWORD,JSON_FILE和URL替换。