如何使用CURL登录spring security登录表单?

问题描述 投票:18回答:5

我正在开发一个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

我应该如何使用模拟情况(CURLHTTPClient)基于弹簧安全性传递登录表单

java curl spring-security
5个回答
21
投票

像这样使用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 )。

login-processing-url

From Spring Security 3.x to 4.x

请注意,在Spring Security 4.x中,/j_spring_security_check的默认值从/login更改为POST username-parameterj_username的默认值从username更改为password-parameterj_password的默认值从password更改为Authorization。如果应用程序显式提供这些属性,则迁移不需要任何操作。


2
投票

您应该配置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 转换进行转换。


2
投票

基于最多投票的答案,我写了以下脚本:

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。


1
投票

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


0
投票

仅仅使用-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替换。

© www.soinside.com 2019 - 2024. All rights reserved.