11

#Spring Securityを使用していますが、ソースページに(ハッシュ)記号が含まれている場合、ソースページへのログインに成功した後にリダイレクトを実装するにはどうすればよいですか。

現在私が使用always-use-default-target="false"しているのは、次のようなURLで正常に機能します/path/to/page/

ただし、URLがURLに#/path/to/page変更されても、リダイレクトは行われません。

それを修正する方法はありますか?

4

2 に答える 2

13

これが私が最後に使用した解決策です:

$(document).ready(function(){
  $('#auth-form').submit(function() {
    var el = $(this);
    var hash = window.location.hash;
    if (hash) el.prop('action', el.prop('action') + '#' + unescape(hash.substring(1)));
    return true;
  });
});

このスニペットは、承認フォームのアクション属性にハッシュを追加し、Springは#/path/to/page問題なく種類のURLにリダイレクトします。

于 2012-10-04T09:00:25.770 に答える
3

これは古い質問かもしれませんが、このトピックに関する最近の調査で、問題は一般的であり、まだ存在していることがわかりました(特に、バックエンドセキュリティを備えた最新のAngularJSフロントエンドアプリの場合)。私の解決策をあなたと共有したいと思います。

ログインページ(例:/login.html)で、</body>タグの前に次のコードを配置します。

<script type="text/javascript">
    var hash = window.location.hash;
    document.cookie="hashPart=" + window.btoa(hash);
</script>

注(1):btoa()関数はIE> = 10(http://www.w3schools.com/jsref/met_win_btoa.asp)で機能します。古いブラウザーでは、同等のjQueryを使用します。

注(2):URLの#部分は、Cookie値の文字列に格納できない特殊文字が含まれている可能性があるため、暗号化する必要があります。

onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)サーバー側からは、インターフェースを実装するクラスのメソッドを変更する必要がありAuthenticationSuccessHandlerます。

私の場合、クラスを拡張し、元のコードを使用してメソッドをSavedRequestAwareAuthenticationSuccessHandlerオーバーライドするだけです。onAuthenticationSuccess次に、リクエストからhashPart cookie値を取得し、それをデコードして、解決されたリダイレクトURLに追加します。以下の私のコードフラグメント:

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication)
        throws ServletException, IOException {

    // ... copy/paste original implementation here, until ...

    // Use the DefaultSavedRequest URL
    String targetUrl = savedRequest.getRedirectUrl();

    for (Cookie cookie : req.getCookies()) {
        if (cookie.getName().equals("hashPart")) {
            targetUrl += new String(Base64Utils.decodeFromString(cookie.getValue()));
            cookie.setMaxAge(0); // clear cookie as no longer needed
            response.addCookie(cookie);
            break;
        }
    }

    getRedirectStrategy().sendRedirect(request, response, targetUrl);
}

最後に、 https://stackoverflow.com/a/21100458/3076403で説明されているように、成功ハンドラークラスをSpringSecurity構成に挿入するだけです。

この問題に対するあなたのコメントや他の解決策を楽しみにしています。

于 2015-06-04T14:24:48.917 に答える