23

私は、ユーザー認証がSpringセキュリティに基づいているspringMVCプロジェクトに取り組んでいます。

アイデアは、ある種のデータをバックエンドに送信できるようにするモバイル(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)を使用して、春のセキュリティに基づいてログインフォームを渡すにはどうすればよいですか?

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

SpringSecurity3.xから4.xへ

Spring Security 4.xでは、login-processing-urlから/j_spring_security_checkに変更された/login場合のデフォルト値、からに変更された場合のデフォルト値、およびusername-parameterからj_usernameに変更された場合のデフォルト値に注意してください。アプリケーションがこれらの属性を明示的に提供する場合、移行にアクションは必要ありません。usernamepassword-parameterj_passwordpassword

于 2012-10-24T13:31:31.520 に答える
3

基本認証をサポートするようにSpringを構成する必要があります。次に、リクエストに次のヘッダーを追加します。

  • 名前:Authorization
  • 価値:base64(username:password)

つまり、ユーザー名とパスワードは:、区切り文字として1つの文字列に連結してから、変換を使用して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

SpringSecurity4で動作します。

于 2016-06-20T19:03:16.853 に答える
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毎回の値を更新できます。

これはSpringsecurity3で機能しました。

于 2017-06-27T20:47:55.753 に答える
1

このスクリプトは、SpringBoot2.1.6およびSpringSecurity5.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 に答える
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 に答える