4

Spring Security XML に次のものがあります。

<form-login login-page="/login" 
            authentication-failure-url="/login/failure" />

認証失敗時にユーザー名を取得したい。SPRING_SECURITY_LAST_USERNAMEから取得できることをネットで読みましたが、私の質問は次のとおりです。

次のいずれかでアクセスするにはどうすればよいですか: 1) 春のセキュリティ XML など

authentication-failure-url="/login/failure/SPRING_SECURITY_LAST_USERNAME"

2) または /login/failure マッピングを処理しているコントローラー。

助けてください。私は立ち往生しています!:(

4

1 に答える 1

8

非推奨です:

/**
  * @deprecated If you want to retain the username, cache it in a customized {@code AuthenticationFailureHandler}
  */
@Deprecated
public static final String SPRING_SECURITY_LAST_USERNAME_KEY = "SPRING_SECURITY_LAST_USERNAME";

したがって、独自の を実装する必要がありますAuthenticationFailureHandler

1) 戦略を実装しました: (ユーザー名には、URL 内で不適切な文字が含まれている可能性があることに注意してください!)

package some.package;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class UsernameInURLAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    private String urlPrefix;
    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
    private String formUsernameKey = UsernamePasswordAuthenticationFilter.SPRING_SECURITY_FORM_USERNAME_KEY;

    public UsernameInURLAuthenticationFailureHandler(String urlPrefix) {
        this.urlPrefix = urlPrefix;
    }

    //Failure logic:
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        //We inherited that method:
        saveException(request, exception);

        //Prepare URL:
        String username = request.getParameter(formUsernameKey);
        String redirectUrl = urlPrefix + username;

        //Redirect:
        redirectStrategy.sendRedirect(request, response, redirectUrl);
    }

    //Getters and setters:
    public String getUrlPrefix() {
        return urlPrefix;
    }

    public void setUrlPrefix(String urlPrefix) {
        this.urlPrefix = urlPrefix;
    }

    public String getFormUsernameKey() {
        return formUsernameKey;
    }

    public void setFormUsernameKey(String formUsernameKey) {
        this.formUsernameKey = formUsernameKey;
    }

    public RedirectStrategy getRedirectStrategy() {
        return redirectStrategy;
    }

    public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
        this.redirectStrategy = redirectStrategy;
    }
}

豆:

<bean class="some.package.UsernameInURLAuthenticationFailureHandler">
        <!-- prefix: -->
        <constructor-arg value="/login/failure/"/>
</bean>

2) 戦略を簡単に実装できます。onAuthenticationFailureユーザー名を URL に追加する代わりに、メソッド内のセッション属性の 1 つとしてユーザー名を保存するだけです。

独自のハンドラーを簡単に設定できます。

<form-login>属性

authentication-failure-handler-ref

authentication-failure-url の代替として使用でき、認証失敗後のナビゲーション フローを完全に制御できます。値は、アプリケーション コンテキスト内の AuthenticationFailureHandler Bean の名前である必要があります。

ドキュメントの詳細:クリック

于 2012-11-25T10:20:22.397 に答える