2013-03-21 8 views
5

私は春のセキュリティを確保しており、login.jspによるログインは完全に正常に動作します。スプリングセキュリティ -/j_spring_security_checkへのディスパッチ

ここで、URLに基​​づいてログインしたユーザーを自動的に取得する必要があります(シングルサインオンに似ています)。基本的には暗号化されたコードであるURLにパスパラメータがあります。このコードを処理して自動ログインを行います。

私は"forward:/j_spring_security_check?j_username="+username+"&j_password="+password

をしています。これは、次のエラーでlogin.jspにするために私に指示し、このユーザー名に&パスワードを使用して、私は自分のユーザー名&パスワードを取得している使用して、有効なパスのparamを持っているかどうかを確認するために私のLoginControllerを修正していますYour login attempt was not successful, try again. Caused : Authentication method not supported: GET

私は"redirect:/j_spring_security_check?j_username="+username+"&j_password="+passwordでも試してみましたが、助けはありません。

コール/j_spring_security_checkPOSTしかしforward: & redirect:GETをやっているので、私は私のLoginControllerからPOSTとして/j_spring_security_checkする方法を派遣することができますか?

おかげ

+0

チェックこれはあなたを助けることができる場合:あなたのためのhttp://stackoverflow.com/a/8229195/322166 – Dani

答えて

10

/j_spring_security_check URLは、要求を処理するためにUsernamePasswordAuthenticationFilterにマップされています。

UsernamePasswordAuthenticationFilterでは、デフォルトでpostOnlytrueに設定されています。

postOnlyからfalseに変更されたspring-security.xmlの次の変更が行われました。

<filter-mapping> <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 
3

代わりgetMethodのために「GET」の「POST」を返し、要求ラッパーを使用してチェックを回避できます。

ただし、理由によるチェックがあります。 URLパラメータとしてクレデンシャルを送信することは、一般に悪い習慣とみなされます。暗号化されたパラメータを使用していても、暗号化されていない認証資格情報を盗む人は誰でもそれを使用して認証することができるため、暗号化されていない認証資格情報を送信することと技術的には同じです。

+0

おかげでまた、web.xmlに、以下の設定が必要です

<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" p:postOnly="false" /> 

貴重なコメント。今のところ、URLパラメータで '/ j_spring_security_check'を直接呼び出す以外に、他の方法がないと考えることができます。 –

+0

/j_spring_security_checkは、セキュリティ上の問題が存在する場所ではありません。フォーム・ログイン・フィルターへのリクエストを作成するのではなく、あなた自身が直接 'AuthenticationManager'を簡単に呼び出すことができます(これは悪い考えです、特にリダイレクトです)。しかし、URLにpathパラメータを送信することは、おそらく最初は良い考えではありません。 –

関連する問題